Come rilevare il sistema operativo da uno script Bash?


526

Vorrei mantenere il mio .bashrce i .bash_loginfile nel controllo della versione in modo da poterli usare tra tutti i computer che uso. Il problema è che ho alcuni alias specifici del sistema operativo, quindi stavo cercando un modo per determinare se lo script è in esecuzione su Mac OS X, Linux o Cygwin .

Qual è il modo corretto di rilevare il sistema operativo in uno script Bash ?


1
Hai mai pensato di condividere le tue configurazioni? Stavo cercando di ottenere lo stesso tipo di installazione :)
sorin

@sorin So che è un vecchio commento, ma se sei ancora curioso, ho creato ProfileGem che ti consente di configurare ambienti bash collegabili per tutte le tue macchine.
dimo414,

1
@ dimo414 profilegem sembra essere stato spostato qui bitbucket.org/dimo414/profilegem . Per quanto riguarda la condivisione di config bash in generale, prova alcuni di questi progetti dotfile: github.com/…
mahemoff,

1
@mahemoff grazie per il link aggiornato, mi dispiace non posso modificare il mio commento. Gradirei feedback o bug se stai sperimentando ProfileGem!
dimo414,

Purtroppo BitBucket sta rifiutando il supporto Mercurial, quindi devo aggiornare di nuovo il mio link :( github.com/dimo414/ProfileGem è la nuova casa.
dimo414

Risposte:


522

Penso che dovrebbe funzionare quanto segue. Non sono sicuro win32però.

if [[ "$OSTYPE" == "linux-gnu"* ]]; then
        # ...
elif [[ "$OSTYPE" == "darwin"* ]]; then
        # Mac OSX
elif [[ "$OSTYPE" == "cygwin" ]]; then
        # POSIX compatibility layer and Linux environment emulation for Windows
elif [[ "$OSTYPE" == "msys" ]]; then
        # Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
elif [[ "$OSTYPE" == "win32" ]]; then
        # I'm not sure this can happen.
elif [[ "$OSTYPE" == "freebsd"* ]]; then
        # ...
else
        # Unknown.
fi

7
Su Windows, otterrai msysGit Bash / msysGit e cygwinCygwin
friederbluemle

1
Questa risposta include il modo di rilevare per Windows è buona. Sto anche usando Mingw32 e viene fuori comemsys
d48

2
Interessante ... Mac OSX darebbe ancora "darwin".
Jonathanbell,

6
Qualcosa che mi ha fatto inciampare, quando sostituisci il commento con un comando: assicurati di finire con ;.
Vadim Peretokin,

1
Quando aggiungo un comando simile source somefile ; , ottengo syntax error near unexpected token elif.
Remo

292

Per il mio .bashrc, utilizzo il seguente codice:

platform='unknown'
unamestr=`uname`
if [[ "$unamestr" == 'Linux' ]]; then
   platform='linux'
elif [[ "$unamestr" == 'FreeBSD' ]]; then
   platform='freebsd'
fi

Quindi faccio qualcosa come:

if [[ $platform == 'linux' ]]; then
   alias ls='ls --color=auto'
elif [[ $platform == 'freebsd' ]]; then
   alias ls='ls -G'
fi

È brutto, ma funziona. Puoi usare caseinvece di ifse preferisci.


6
Perché imposti la piattaforma da unamestr, invece di usare solo unamestr?
csexton,

80
Non usare i backtick, usa la sintassi più chiara più recente: "unamestr = $ (uname)".
Rilassati il

15
Da una rapida occhiata, i backtick potrebbero assomigliare a una corda.
Harrison Powers

29
@ david-winiecki Perché se devi annidare i comandi, ad esempio $ (command-1 $ (command-2))
Michael Barton,

4
Non sarebbe molto meglio fare: platform="$(uname | tr '[:upper:]' '[:lower:]')"e poi sicuramente gestire in un caso? Sembra strano codificare una dipendenza su output molto specifici.
Brandon Buck,

274

La manpage bash dice che la variabile OSTYPE memorizza il nome del sistema operativo:

OSTYPEImpostato automaticamente su una stringa che descrive il sistema operativo su cui è in esecuzione bash. L'impostazione predefinita dipende dal sistema.

È impostato linux-gnuqui.


5
Inoltre, $ OSTYPE è 'darwin9.0' sul mio mac (Leopard) e 'cygwin' sotto Cygwin.
dF.

5
$ OSTYPE è darwin10.0 su SnowLeopard. WTF con la versione aggiunta? Significa che una semplice dichiarazione del caso non funzionerà.
mxcl,

16
Non è un grosso problema rimuoverlo:os=${OSTYPE//[0-9.]/}
Abach,

86
case $OSTYPE in darwin*) echo I am a Mac ;; esac
tripla il

36
@tripleee o per le persone che si sentono più a proprio agio con la sintassi "if":if [[ $OSTYPE == darwin* ]]; then echo I am a Mac;fi
Rican7

159

$OSTYPE

Puoi semplicemente usare una $OSTYPEvariabile predefinita , ad esempio:

case "$OSTYPE" in
  solaris*) echo "SOLARIS" ;;
  darwin*)  echo "OSX" ;; 
  linux*)   echo "LINUX" ;;
  bsd*)     echo "BSD" ;;
  msys*)    echo "WINDOWS" ;;
  *)        echo "unknown: $OSTYPE" ;;
esac

Tuttavia, non è riconosciuto dalle shell più vecchie (come la shell Bourne ).


uname

Un altro metodo è rilevare la piattaforma in base al unamecomando.

Vedi il seguente script (pronto per essere incluso in .bashrc):

# Detect the platform (similar to $OSTYPE)
OS="`uname`"
case $OS in
  'Linux')
    OS='Linux'
    alias ls='ls --color=auto'
    ;;
  'FreeBSD')
    OS='FreeBSD'
    alias ls='ls -G'
    ;;
  'WindowsNT')
    OS='Windows'
    ;;
  'Darwin') 
    OS='Mac'
    ;;
  'SunOS')
    OS='Solaris'
    ;;
  'AIX') ;;
  *) ;;
esac

Puoi trovare alcuni esempi pratici nel mio.bashrc .


Ecco una versione simile utilizzata su Travis CI :

case $(uname | tr '[:upper:]' '[:lower:]') in
  linux*)
    export TRAVIS_OS_NAME=linux
    ;;
  darwin*)
    export TRAVIS_OS_NAME=osx
    ;;
  msys*)
    export TRAVIS_OS_NAME=windows
    ;;
  *)
    export TRAVIS_OS_NAME=notset
    ;;
esac

1
Nel controllo $ OSTYPE manca un ramo per cygwin, che indicherebbe un computer Windows. Anche il controllo uname non funzionerebbe correttamente, su cygwin uname restituisce "CYGWIN_NT-10.0" e su MinGW uname restituisce "MINGW64_NT-10.0".
Matt Pennington,

1
alias ls = '/ bin / ls -G' è in realtà l'opzione sicura, nel contesto di
flag

Suggerisco di usare uname, Oracle ha glossed convention e mettere una stringa di versione gratuita con il loro OSTYPE ==> solaris2.11. unameè un po 'più pulito e richiede meno lavoro.
sarà

37

Rilevare il sistema operativo e il tipo di CPU non è così facile da eseguire in modo portabile . Ho una shsceneggiatura di circa 100 linee che funziona su un'ampia varietà di piattaforme Unix: qualsiasi sistema che ho usato dal 1988.

Gli elementi chiave sono

  • uname -pè di tipo processore ma di solito è unknownsu moderne piattaforme Unix.

  • uname -m darà il "nome hardware della macchina" su alcuni sistemi Unix.

  • /bin/arch, se esiste, di solito fornisce il tipo di processore.

  • uname senza argomenti nominerà il sistema operativo.

Alla fine dovrai pensare alle distinzioni tra piattaforme e quanto bene vuoi farle. Ad esempio, solo per mantenere le cose semplici, mi trattano i386tramite i686, qualsiasi " Pentium*" e qualsiasi " AMD*Athlon*" tutti come x86.

My ~/.profileesegue uno script all'avvio che imposta una variabile su una stringa che indica la combinazione di CPU e sistema operativo. Ho piattaforma specifica bin, man, lib, e includele directory che vengono impostati sulla base di tale. Quindi ho impostato un carico di variabili d'ambiente. Quindi, ad esempio, uno script di shell per riformattare la posta può chiamare, ad esempio, $LIB/mailfmtche è un binario eseguibile specifico della piattaforma.

Se vuoi tagliare gli angoli , uname -me Plain unameti dirà cosa vuoi sapere su molte piattaforme. Aggiungi altre cose quando ne hai bisogno. (E usare case, non nidificato if!)


2
Secondo il comando uname , uname senza un parametro equivale a utilizzare il parametro "-s": "-s Visualizza il nome del sistema. Questo flag è attivo per impostazione predefinita.". Per essere espliciti si potrebbe usare "uname -s" invece di "uname". (Elaborato in qualche modo in una risposta a "Shell output help" )
Peter Mortensen,

Hai un link a github git o pastebin con questo script 100 per rilevare in modo affidabile l'architettura del sistema operativo e del processore?
Andrew De Andrade,

4
@AndrewDeAndrade Mi vergogno di esporre questo codice al pubblico. pastebin.com/J66Lj6wf
Norman Ramsey

quindi che ne dici uname -s?
Alexander Mills,

35

Consiglio di usare questo codice bash completo

lowercase(){
    echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
}

OS=`lowercase \`uname\``
KERNEL=`uname -r`
MACH=`uname -m`

if [ "{$OS}" == "windowsnt" ]; then
    OS=windows
elif [ "{$OS}" == "darwin" ]; then
    OS=mac
else
    OS=`uname`
    if [ "${OS}" = "SunOS" ] ; then
        OS=Solaris
        ARCH=`uname -p`
        OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
    elif [ "${OS}" = "AIX" ] ; then
        OSSTR="${OS} `oslevel` (`oslevel -r`)"
    elif [ "${OS}" = "Linux" ] ; then
        if [ -f /etc/redhat-release ] ; then
            DistroBasedOn='RedHat'
            DIST=`cat /etc/redhat-release |sed s/\ release.*//`
            PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
            REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
        elif [ -f /etc/SuSE-release ] ; then
            DistroBasedOn='SuSe'
            PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
            REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
        elif [ -f /etc/mandrake-release ] ; then
            DistroBasedOn='Mandrake'
            PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
            REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
        elif [ -f /etc/debian_version ] ; then
            DistroBasedOn='Debian'
            DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F=  '{ print $2 }'`
            PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F=  '{ print $2 }'`
            REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F=  '{ print $2 }'`
        fi
        if [ -f /etc/UnitedLinux-release ] ; then
            DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
        fi
        OS=`lowercase $OS`
        DistroBasedOn=`lowercase $DistroBasedOn`
        readonly OS
        readonly DIST
        readonly DistroBasedOn
        readonly PSUEDONAME
        readonly REV
        readonly KERNEL
        readonly MACH
    fi

fi

altri esempi esempi qui: https://github.com/coto/server-easy-install/blob/master/lib/core.sh


1
Hai lasciato fuori la funzione minuscola, ho aggiornato la tua risposta per te.
Robin Clowers,

1
Una volta che sai che è Linux, se stai solo frugando (senza cercare di automatizzare la scoperta) sembra che la mossa più semplice sia semplicemente ls /etccercare "blah-release" - qualunque sia blah, è il sistema operativo Linux - CentOS, Ubuntu , ecc.
Chris Moschini,

1
Ho modificato perché alcuni dei riferimenti alla variabile del sistema operativo sono stati scritti come "{$ OS}", li ho cambiati in "$ {OS}" è il modo giusto, l'ho testato
bazz

considereresti di aggiungere "echo $ {OS}" alla fine dello script?
Oleg Kokorin,

10

In bash, usa $OSTYPEe $HOSTTYPE, come documentato; questo è ciò che faccio. Se ciò non è abbastanza e se pari unameo uname -a(o altre opzioni appropriate) non forniscono abbastanza informazioni, c'è sempre lo script config.guess del progetto GNU, creato esattamente per questo scopo.


10

Suggerirei di evitare alcune di queste risposte. Non dimenticare che puoi scegliere altre forme di confronto tra stringhe, che chiarirebbero la maggior parte delle variazioni o il brutto codice offerto.

Una di queste soluzioni sarebbe un semplice controllo, come ad esempio:

if [[ "$OSTYPE" =~ ^darwin ]]; then

Il che ha l'ulteriore vantaggio di abbinare qualsiasi versione di Darwin, nonostante sia il suffisso della versione. Questo funziona anche per eventuali variazioni che Linuxuno può aspettarsi.

Puoi vedere alcuni esempi aggiuntivi nei miei dotfile qui


9

Prova a utilizzare "uname". Ad esempio, in Linux: "uname -a".

Secondo la pagina del manuale, uname è conforme a SVr4 e POSIX, quindi dovrebbe essere disponibile anche su Mac OS X e Cygwin , ma non posso confermarlo.

A proposito: $ OSTYPE è impostato anche linux-gnuqui :)


Senza parametri, uname stampa 'Darwin' su Mac OS X (leopardo). Con -a stampa molte informazioni extra (versione del kernel, architettura e qualcos'altro che non riesco a decifrare). Non posso testare su Cygwin
David Rodríguez - dribeas, il

8

Ho scritto questi zuccheri nel mio .bashrc:

if_os () { [[ $OSTYPE == *$1* ]]; }
if_nix () { 
    case "$OSTYPE" in
        *linux*|*hurd*|*msys*|*cygwin*|*sua*|*interix*) sys="gnu";;
        *bsd*|*darwin*) sys="bsd";;
        *sunos*|*solaris*|*indiana*|*illumos*|*smartos*) sys="sun";;
    esac
    [[ "${sys}" == "$1" ]];
}

Quindi posso fare cose come:

if_nix gnu && alias ls='ls --color=auto' && export LS_COLORS="..."
if_nix bsd && export CLICOLORS=on && export LSCOLORS="..."
if_os linux && alias psg="ps -FA | grep" #alternative to pgrep
if_nix bsd && alias psg="ps -alwx | grep -i" #alternative to pgrep
if_os darwin && alias finder="open -R"

A proposito, queste 9 linee funzionano su qualsiasi Bash in esecuzione su quasi tutto. Nessuno shellout e funziona con quasi tutti gli stili di .bashrc personali (grandi alberi if / case nidificati o molti alias casuali). IMO, toglie i pantaloni da ogni risposta sopra di esso.
kfix,

Finora, il più vicino al completamento per includere Cygwin e altri BSD (fondamentalmente compilation del popolare * NIX)
HidekiAI

Completa per gli utenti che sono rilevanti oggi ed esegui Bash. Gli utenti AIX / HP-UX / IRIX / OpenVMS potrebbero entrare in contatto. Il nuovo sottosistema Windows per Linux esegue un'installazione Ubuntu amd64 di serie, quindi dovrebbe essere vero per entrambi if_nix gnu& if_os linux.
kfix,

1
@kfix sì esatto, il sottosistema win 10 bash genera "linux-gnu" per echo $OSTYPE. Per rilevare specificamente il sottosistema win 10 bash, l'unica soluzione che ho trovato è stata la ricerca di "Microsoft" in/proc/sys/kernel/osrelease
Jpnh


7

Ho scritto una libreria personale di Bash e un framework di scripting che utilizza GNU shtool per eseguire un rilevamento della piattaforma piuttosto accurato.

GNU shtool è un set di script molto portabile che contiene, tra le altre cose utili, il comando 'shtool platform'. Ecco l'output di:

shtool platform -v -F "%sc (%ac) %st (%at) %sp (%ap)"

su alcune macchine diverse:

Mac OS X Leopard: 
    4.4BSD/Mach3.0 (iX86) Apple Darwin 9.6.0 (i386) Apple Mac OS X 10.5.6 (iX86)

Ubuntu Jaunty server:
    LSB (iX86) GNU/Linux 2.9/2.6 (i686) Ubuntu 9.04 (iX86)

Debian Lenny:
    LSB (iX86) GNU/Linux 2.7/2.6 (i686) Debian GNU/Linux 5.0 (iX86)

Questo produce risultati abbastanza soddisfacenti, come puoi vedere. GNU shtool è un po 'lento, quindi in realtà memorizzo e aggiorno l'identificazione della piattaforma in un file sul sistema che i miei script chiamano. È il mio framework, quindi funziona per me, ma il tuo chilometraggio può variare.

Ora dovrai trovare un modo per impacchettare shtool con i tuoi script, ma non è un esercizio difficile. Puoi sempre ripiegare su output uname, anche.

MODIFICARE:

Mi mancava il post di Teddy config.guess(in qualche modo). Questi sono script molto simili, ma non uguali. Personalmente uso shtool anche per altri usi, e ha funzionato abbastanza bene per me.


7

È possibile utilizzare quanto segue:

OS=$(uname -s)

allora puoi usare la variabile OS nel tuo script.


puoi spiegare come uname -sè diverso da uname?
Alexander Mills,

@AlexanderMills -s, --kernel-name stampa il nome del kernel
Chetan Kapoor

6

Di seguito è riportato un approccio per rilevare il sistema operativo Linux basato su Debian e RedHat usando le versioni / etc / lsb e / etc / os (a seconda del tipo di Linux che si sta utilizzando) e fare una semplice azione basata su di esso.

#!/bin/bash
set -e

YUM_PACKAGE_NAME="python python-devl python-pip openssl-devel"
DEB_PACKAGE_NAME="python2.7 python-dev python-pip libssl-dev"

 if cat /etc/*release | grep ^NAME | grep CentOS; then
    echo "==============================================="
    echo "Installing packages $YUM_PACKAGE_NAME on CentOS"
    echo "==============================================="
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Red; then
    echo "==============================================="
    echo "Installing packages $YUM_PACKAGE_NAME on RedHat"
    echo "==============================================="
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Fedora; then
    echo "================================================"
    echo "Installing packages $YUM_PACKAGE_NAME on Fedorea"
    echo "================================================"
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Ubuntu; then
    echo "==============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Ubuntu"
    echo "==============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Debian ; then
    echo "==============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Debian"
    echo "==============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Mint ; then
    echo "============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Mint"
    echo "============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Knoppix ; then
    echo "================================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Kanoppix"
    echo "================================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 else
    echo "OS NOT DETECTED, couldn't install package $PACKAGE"
    exit 1;
 fi

exit 0

Esempio di output per Ubuntu Linux:

delivery@delivery-E5450$ sudo sh detect_os.sh
[sudo] password for delivery: 
NAME="Ubuntu"
===============================================
Installing packages python2.7 python-dev python-pip libssl-dev on Ubuntu
===============================================
Ign http://dl.google.com stable InRelease
Get:1 http://dl.google.com stable Release.gpg [916 B]                          
Get:2 http://dl.google.com stable Release [1.189 B] 
...            

5

Questo dovrebbe essere sicuro da usare su tutte le distro.

$ cat /etc/*release

Questo produce qualcosa del genere.

     DISTRIB_ID=LinuxMint
     DISTRIB_RELEASE=17
     DISTRIB_CODENAME=qiana
     DISTRIB_DESCRIPTION="Linux Mint 17 Qiana"
     NAME="Ubuntu"
     VERSION="14.04.1 LTS, Trusty Tahr"
     ID=ubuntu
     ID_LIKE=debian
     PRETTY_NAME="Ubuntu 14.04.1 LTS"
     VERSION_ID="14.04"
     HOME_URL="http://www.ubuntu.com/"
     SUPPORT_URL="http://help.ubuntu.com/"
     BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

Estrai / assegna alle variabili come desideri

Nota: su alcune configurazioni. Questo potrebbe anche darti alcuni errori che puoi ignorare.

     cat: /etc/upstream-release: Is a directory

Nota: su CentOS, questo dà[user@host ~]$ cat /etc/*release CentOS release 6.4 (Final) CentOS release 6.4 (Final) CentOS release 6.4 (Final)
cfstras

Sì, l'output che ho pubblicato è stato un esempio, da uno dei miei laptop, non contenuto statico che vedi ovunque.
RJ

Ho appena aggiunto che nessuno penserebbe che il risultato sia sempre nella stessa forma :)
cfstras

1
+1 Sto usando set -e all'inizio dello script (quindi questa soluzione non funziona doxer.org/linux-shell-centos-debian-ostype ). E altre soluzioni non sono specificamente CentOS. Ma ho trovato questo riferimento che ha dimostrato questa risposta unix.stackexchange.com/a/92212
gihanchanuka,

4
non funziona per Mac:cat: /etc/*release: No such file or directory
cancella il

3

prova questo:

DISTRO=$(cat /etc/*-release | grep -w NAME | cut -d= -f2 | tr -d '"')
echo "Determined platform: $DISTRO"

Su macOS ottengocat: /etc/*-release: No such file or directory
csexton l'

@csexton davvero, sto ottenendo lo stesso: zsh: no matches found: /etc/*release- questo funzionerà solo per i sistemi linux, suppongo ...
Alexander Nekrasov,

Questa risposta funziona solo per Linux, sicuramente. Ma altre risposte sono in grado di rilevare Linux in opposizione solo ad altri sistemi. Questa scoperta di base non aiuta affatto a scoprire una particolare distribuzione Linux è tanto essenziale quanto la distinzione tra FreeBSD e Darwin.
Thomas Urban,

3

È possibile utilizzare la seguente clausola if ed espanderla secondo necessità:

if [ "${OSTYPE//[0-9.]/}" == "darwin" ]
then
    aminute_ago="-v-1M"
elif  [ "${OSTYPE//[0-9.]/}" == "linux-gnu" ]
then
    aminute_ago="-d \"1 minute ago\""
fi

2

Ho provato i messaggi di cui sopra in alcune distro Linux e ho trovato quanto segue per funzionare meglio per me. È una risposta breve, concisa e precisa, che funziona anche con Bash su Windows.

OS=$(cat /etc/*release | grep ^NAME | tr -d 'NAME="') #$ echo $OS # Ubuntu

2
Sebbene questo frammento di codice sia il benvenuto e possa fornire qualche aiuto, sarebbe notevolmente migliorato se includesse una spiegazione di come e perché risolve il problema. Ricorda che stai rispondendo alla domanda per i lettori in futuro, non solo per la persona che chiede ora! Si prega di modificare la risposta di aggiungere una spiegazione, e dare un'indicazione di ciò si applicano le limitazioni e le assunzioni.
Toby Speight,

1
Sembra bello e conciso per la maggior parte dei sistemi Linux, ma sfortunatamente questo comporterà un errore su macOS. Forse questo è più "rilevare il sapore di distribuzione di Linux da Bash
csexton l'

1
@csexton OS=$( ([[ -f /etc/*release ]] && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || echo "Unknown" )funzionerà senza errori di lancio.
Kuzeko,

In realtà, ecco un modo correttoOS=$( $(compgen -G "/etc/*release" > /dev/null) && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || $( echo "${OSTYPE//[0-9.]/}")
Kuzeko,

@Kuzeko Sfortunatamente ho ancora errori durante l'esecuzione su macOS.
csexton,

1

Tendo a mantenere i miei .bashrc e .bash_alias su una condivisione file a cui tutte le piattaforme possono accedere. È così che vinco il problema nel mio .bash_alias:

if [[ -f (name of share)/.bash_alias_$(uname) ]]; then
    . (name of share)/.bash_alias_$(uname)
fi

E ho ad esempio un .bash_alias_Linux con:

alias ls='ls --color=auto'

In questo modo mantengo separato il codice specifico della piattaforma e portatile, puoi fare lo stesso per .bashrc


1

Questo controlla un mucchio di knownfile per identificare se la distribuzione Linux è Debian o Ubunu, quindi per impostazione predefinita è la $OSTYPEvariabile.

os='Uknown'
unamestr="${OSTYPE//[0-9.]/}"
os=$( compgen -G "/etc/*release" > /dev/null  && cat /etc/*release | grep ^NAME | tr -d 'NAME="'  ||  echo "$unamestr")

echo "$os"

-1

Fare quanto segue ha aiutato a eseguire correttamente il controllo per Ubuntu:

if [[ "$OSTYPE" =~ ^linux ]]; then
    sudo apt-get install <some-package>
fi

4
Che dire di altri sistemi Linux che non usano apt-get?
Wilf,

ubuntu è una distribuzione, non una classe di sistema operativo.
jitter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.