Chciałbym zachować kontrolę nad plikami .bashrc
i .bash_login
plikami, aby móc ich używać między wszystkimi komputerami, których używam. Problem polega na tym, że mam pewne aliasy specyficzne dla systemu operacyjnego, więc szukałem sposobu, aby ustalić, czy skrypt działa w systemie Mac OS X, Linux lub Cygwin .
Jaki jest właściwy sposób na wykrycie systemu operacyjnego w skrypcie Bash ?
bash
os-detection
Csexton
źródło
źródło
Odpowiedzi:
Myślę, że następujące powinny działać. Nie jestem jednak pewien
win32
.źródło
msys
dla Git Bash / msysGit, acygwin
dla Cygwinmsys
;
.source somefile ;
, otrzymujęsyntax error near unexpected token elif
.W moim .bashrc używam następującego kodu:
Potem robię coś takiego:
Jest brzydka, ale działa. Możesz użyć
case
zamiast,if
jeśli wolisz.źródło
platform="$(uname | tr '[:upper:]' '[:lower:]')"
a następnie zdecydowanie poradzić sobie w sprawie? Po prostu dziwne wydaje się kodowanie zależności od bardzo specyficznych danych wyjściowych.Strona podręcznika bash mówi, że zmienna OSTYPE przechowuje nazwę systemu operacyjnego:
Jest ustawiony
linux-gnu
tutaj.źródło
os=${OSTYPE//[0-9.]/}
case $OSTYPE in darwin*) echo I am a Mac ;; esac
if [[ $OSTYPE == darwin* ]]; then echo I am a Mac;fi
$OSTYPE
Możesz po prostu użyć wstępnie zdefiniowanej
$OSTYPE
zmiennej, np .:Jednak nie jest rozpoznawany przez starsze powłoki (takie jak powłoka Bourne'a ).
uname
Inną metodą jest wykrywanie platformy na podstawie
uname
polecenia.Zobacz następujący skrypt (gotowy do włączenia w .bashrc):
Możesz znaleźć praktyczny przykład w moim
.bashrc
.Oto podobna wersja używana w Travis CI :
źródło
uname
, Oracle przełożyło konwencję i umieściło w niej ciąg darmowej wersjiOSTYPE ==> solaris2.11
.uname
jest trochę czystszy i mniej pracy.Wykrywanie systemu operacyjnego i typu procesora nie jest tak łatwe do przenoszenia . Mam
sh
skrypt około 100 linii, który działa na bardzo szerokiej gamie platform Unix: każdy system, z którego korzystam od 1988 roku.Kluczowymi elementami są
uname -p
jest typem procesora, ale zwykle znajduje sięunknown
na nowoczesnych platformach Unix.uname -m
poda „nazwę sprzętu” na niektórych systemach uniksowych./bin/arch
, jeśli istnieje, zwykle podaje typ procesora.uname
bez argumentów nazwa systemu operacyjnego.W końcu będziesz musiał pomyśleć o różnicach między platformami i o tym, jak dobrze chcesz je tworzyć. Na przykład, żeby zachować rzeczy proste, traktuję
i386
przezi686
każde „Pentium*
” i każdy „AMD*Athlon*
” wszystko jakox86
.Mój
~/.profile
uruchamia skrypt podczas uruchamiania, który ustawia jedną zmienną na ciąg wskazujący kombinację procesora i systemu operacyjnego. Mam od platformybin
,man
,lib
, iinclude
katalogi, które uzyskać utworzone na podstawie tego. Następnie ustawiam zestaw zmiennych środowiskowych. Na przykład skrypt powłoki w celu przeformatowania poczty może wywoływać np.$LIB/mailfmt
Specyficzny dla platformy plik binarny wykonywalny.Jeśli chcesz skracać rogi ,
uname -m
a zwykłyuname
poinformuje Cię, co chcesz wiedzieć na wielu platformach. Dodaj inne rzeczy, kiedy ich potrzebujesz. (I użyjcase
, nie zagnieżdżonyif
!)źródło
uname -s
?Polecam użyć tego pełnego kodu bash
więcej przykładów tutaj: https://github.com/coto/server-easy-install/blob/master/lib/core.sh
źródło
ls /etc
poszukiwanie „bla-release” - cokolwiek to jest, to Linux OS - CentOS, Ubuntu itp.W bashu używaj
$OSTYPE
i$HOSTTYPE
, jak udokumentowano; to jest to, co robie. Jeśli to nie wystarczy, a nawetuname
lubuname -a
(lub inne odpowiednie opcje) nie dają wystarczających informacji, zawsze jest skrypt config.guess z projektu GNU, stworzony specjalnie do tego celu.źródło
Sugerowałbym unikanie niektórych z tych odpowiedzi. Nie zapominaj, że możesz wybrać inne formy porównywania ciągów, które wyczyściłyby większość wariantów lub oferował brzydki kod.
Jednym z takich rozwiązań byłoby proste sprawdzenie, takie jak:
if [[ "$OSTYPE" =~ ^darwin ]]; then
Co ma tę dodatkową zaletę, że pasuje do dowolnej wersji Darwina, pomimo sufiksu wersji. Działa to również w przypadku każdej odmiany,
Linux
jakiej można się spodziewać.Możesz zobaczyć dodatkowe przykłady w moich plikach dot tutaj
źródło
Spróbuj użyć „uname”. Na przykład w systemie Linux: „uname -a”.
Według strony podręcznika, uname jest zgodny z SVr4 i POSIX, więc powinien być dostępny również w Mac OS X i Cygwin , ale nie mogę tego potwierdzić.
BTW: $ OSTYPE jest również ustawione
linux-gnu
tutaj :)źródło
Te cukry napisałem w moim
.bashrc
:Więc mogę robić takie rzeczy jak:
źródło
if_nix gnu
&if_os linux
.echo $OSTYPE
. Aby wykryć konkretnie podsystem Win 10 Bash, jedynym rozwiązaniem, jakie znalazłem, było sprawdzenie „Microsoft” w/proc/sys/kernel/osrelease
lub
jeśli chcesz więcej informacji
źródło
Napisałem osobistą bibliotekę Bash i platformę skryptową, która wykorzystuje GNU shtool do dość dokładnego wykrywania platformy.
GNU shtool to bardzo przenośny zestaw skryptów, który zawiera między innymi przydatne polecenie „platforma shtool”. Oto wynik:
na kilku różnych maszynach:
Jak widać, daje to całkiem zadowalające wyniki. GNU shtool jest trochę wolny, więc właściwie przechowuję i aktualizuję identyfikację platformy w pliku w systemie, który wywołują moje skrypty. To moja platforma, więc działa dla mnie, ale twój przebieg może się różnić.
Teraz musisz znaleźć sposób na spakowanie shtoola za pomocą swoich skryptów, ale nie jest to trudne zadanie. Zawsze możesz również polegać na wyjściu uname.
EDYTOWAĆ:
Brakowało mi posta Teddy'ego o
config.guess
(jakoś). Są to bardzo podobne skrypty, ale nie takie same. Osobiście używam shtoola również do innych celów i działa całkiem dobrze dla mnie.źródło
Możesz użyć następujących opcji:
wtedy możesz użyć zmiennej OS w swoim skrypcie.
źródło
uname -s
się różniuname
?Poniżej znajduje się podejście do wykrywania systemu operacyjnego Linux opartego na Debian i RedHat przy użyciu / etc / lsb-release i / etc / os-release (w zależności od używanego smaku Linuksa) i podjęcie na jego podstawie prostej akcji.
Przykład danych wyjściowych dla systemu Ubuntu Linux:
źródło
Powinno to być bezpieczne w użyciu na wszystkich dystrybucjach.
To produkuje coś takiego.
Wyodrębnij / przypisz do zmiennych, jak chcesz
Uwaga: w niektórych konfiguracjach. Może to również powodować błędy, które możesz zignorować.
źródło
[user@host ~]$ cat /etc/*release CentOS release 6.4 (Final) CentOS release 6.4 (Final) CentOS release 6.4 (Final)
cat: /etc/*release: No such file or directory
Spróbuj tego:
źródło
cat: /etc/*-release: No such file or directory
zsh: no matches found: /etc/*release
- to będzie działać tylko w systemach Linux, jak sądzę ...Możesz użyć następującej klauzuli if i rozwinąć ją w razie potrzeby:
źródło
Wypróbowałem powyższe komunikaty w kilku dystrybucjach Linuksa i znalazłem następujące, które działają najlepiej dla mnie. To krótka, zwięzła, dokładna odpowiedź na słowo, która działa również w Bash na Windowsie.
źródło
OS=$( ([[ -f /etc/*release ]] && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || echo "Unknown" )
to zadziała bez zgłaszania błędów.OS=$( $(compgen -G "/etc/*release" > /dev/null) && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || $( echo "${OSTYPE//[0-9.]/}")
Staram się przechowywać pliki .bashrc i .bash_alias w udziale plików, do którego mają dostęp wszystkie platformy. Oto jak pokonałem problem w mojej .bash_alias:
I mam na przykład .bash_alias_Linux z:
W ten sposób oddzielam kod specyficzny dla platformy i przenośny, możesz zrobić to samo dla .bashrc
źródło
Sprawdza to kilka
known
plików w celu ustalenia, czy dystrybucją Linuksa jest Debian lub Ubunu, a następnie domyślnie jest to$OSTYPE
zmienna.źródło
Wykonanie następujących czynności pomogło poprawnie wykonać sprawdzenie Ubuntu:
źródło