Pracuję nad prostym skryptem bash, który powinien być w stanie uruchomić na dystrybucjach Ubuntu i CentOS (wsparcie dla Debiana i Fedory / RHEL byłoby plusem) i muszę znać nazwę i wersję dystrybucji, w której działa skrypt ( w celu uruchomienia określonych działań, na przykład tworzenia repozytoriów). Jak dotąd mam to:
OS=$(awk '/DISTRIB_ID=/' /etc/*-release | sed 's/DISTRIB_ID=//' | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')
VERSION=$(awk '/DISTRIB_RELEASE=/' /etc/*-release | sed 's/DISTRIB_RELEASE=//' | sed 's/[.]0/./')
if [ -z "$OS" ]; then
OS=$(awk '{print $1}' /etc/*-release | tr '[:upper:]' '[:lower:]')
fi
if [ -z "$VERSION" ]; then
VERSION=$(awk '{print $3}' /etc/*-release)
fi
echo $OS
echo $ARCH
echo $VERSION
Wygląda na to, że działa, powraca ubuntu
lub centos
(nie próbowałem innych) jako nazwa wydania. Mam jednak wrażenie, że musi istnieć łatwiejszy i bardziej niezawodny sposób na znalezienie tego - czy to prawda?
To nie działa dla RedHat. / etc / redhat-release zawiera: Redhat Linux Entreprise wydanie 5.5
Więc wersja nie jest trzecim słowem, lepiej użyj:
OS_MAJOR_VERSION=`sed -rn 's/.*([0-9])\.[0-9].*/\1/p' /etc/redhat-release`
OS_MINOR_VERSION=`sed -rn 's/.*[0-9].([0-9]).*/\1/p' /etc/redhat-release`
echo "RedHat/CentOS $OS_MAJOR_VERSION.$OS_MINOR_VERSION"
+-release
działa? Efektywnie wyglądasz, zakładając, że tak będzie/etc/lsb-release
, więc może po prostu nazwij to tak.*
w+
celu uniknięcia komentarz formatowania, powinno byćetc/*-release
, wydaje się działać.uname -rv | grep -i "name_of_distro"
i nie używa kodu wyjścia?Odpowiedzi:
Aby uzyskać
OS
iVER
, wydaje się, że najnowszy standard/etc/os-release
. Wcześniej byłolsb_release
i/etc/lsb-release
. Wcześniej trzeba było szukać różnych plików dla każdej dystrybucji.Oto, co zasugeruję
Myślę, że
uname
aby dostać sięARCH
jest nadal najlepszym sposobem. Ale podany przez ciebie przykład oczywiście dotyczy tylko systemów Intel. Nazwałbym toBITS
tak:Lub zmień
ARCH
na bardziej popularne, ale jednoznaczne wersje:x86
ix64
podobne:ale oczywiście to zależy od ciebie.
źródło
-
i_
? Może jest w/lib/lsb
czymś takim. Corpm -qa "lsb*"
drukuje?rpm -qa "lsb*
nic nie drukuje. Zgodnie zyum provides */lsb_release
nim jest zawarty w pakiecie o nazwie redhat-lsb, który, jak sądzę, nie jest domyślnie instalowany. Jednak nie jestem ekspertem od Fedory, są to tylko wyniki losowej maszyny wirtualnej Fedory, którą mam i mogą się bardzo mylić.lsb-release
, jak powiedziałeś.$OS
,$VERSION
itp - umownie możemy wykorzystać zmienne środowiskowe (pager, redaktor, SHELL, ...) i wewnętrzne zmienne powłoki (BASH_VERSION, losowe, ...). Wszystkie pozostałe nazwy zmiennych powinny zawierać co najmniej jedną małą literę. Konwencja ta pozwala uniknąć przypadkowego zastąpienia zmiennych środowiskowych i wewnętrznych.Chciałbym to zrobić jako pierwszy krok:
Gentoo, RedHat, Arch i SuSE mają plik o nazwie np
/etc/gentoo-release
. Wydaje się być popularny, sprawdź tę stronę o plikach wydania .Debian i Ubuntu powinny również
/etc/lsb-release
zawierać informacje o wydaniu i będą wyświetlane z poprzednim poleceniem.Kolejny szybki to
uname -rv
. Jeśli zainstalowane jądro jest standardowym jądrem dystrybucji,zwykleznajdziesz tam nazwę.źródło
uname -a
.uname -rv
zawiera informacji?uname -a
wypisze rzeczy, takie jak typ procesora i nazwa hosta, które nie są tu istotne. (Ale zarówno wydanie jądra (-r
), jak i wersja (-v
) są konieczne, nie wszystkie dystrybucje robią to tam samo)2.6.32-5-686-bigmem
i uname -v daje#1 SMP Tue Mar 8 22:14:55 UTC 2011
na Debianie 6. uname -a OTOH dajeLinux debian 2.6.32-5-686-bigmem #1 SMP Tue Mar 8 22:14:55 UTC 2011 i686 GNU/Linux
.uname -a
to-n
, tj. nazwa węzła == nazwa hosta. powiedziałbym,uname
że nie będzie interesujący na Debianie. Pomyśl o tym, ale nie jestem pewien, czy jest on tak przydatny w RedHat.debian
.lsb_release -a
. Działa na Debianie i chyba Ubuntu, ale nie jestem pewien co do reszty. Zwykle powinien istnieć we wszystkich dystrybucjach GNU / Linux, ponieważ jest związany z LSB (Linux Standard Base).źródło
Jednowarstwowy, awarie, jedna linia wyników, bez błędów.
źródło
Lub tylko
źródło
Weź napiwek od programistów javascript. Nie testuj wersji, testuj możliwości. To nie jest ładne, ale działa. Rozwiń w razie potrzeby.
źródło
W kolejności najbardziej prawdopodobnego sukcesu:
obejmuje większość przypadków (AFAIK): Debian, Ubuntu, Slackware, Suse, Redhat, Gentoo, * BSD i być może inne.
źródło
cat /etc/*version
nie działa (nie ma takiego pliku) na CentOS (przynajmniej na 6.4)W przypadku większości współczesnych systemów Linux, plik
/etc/os-release
naprawdę staje się standardem i włącza się do większości systemów operacyjnych. Tak więc w skrypcie Bash możesz po prostu dołączyć plik i będziesz mieć dostęp do wszystkich opisanych tutaj zmiennych (na przykład: NAZWA, WERSJA, ...)Używam tego w moim skrypcie Bash:
źródło
Jeśli plik
/etc/debian_version
istnieje, dystrybucja to Debian lub pochodna Debiana. Ten plik może mieć numer wydania; na moim komputerze jest obecnie6.0.1
. Jeśli jest testowany lub niestabilny, może powiedzieć testowanie / niestabilny lub może mieć numer nadchodzącego wydania. Mam wrażenie, że przynajmniej na Ubuntu ten plik zawsze testuje / jest niestabilny i że nie umieszczają w nim numeru wydania, ale ktoś może mnie poprawić, jeśli się mylę.Fedora (przynajmniej ostatnie wydania) mają podobny plik, a mianowicie
/etc/fedora-release
.źródło
/etc/debian_version
i/etc/os-release
./etc/debian_version
plik. Tak więc sposób, w jaki przygotowujemy instalację Debiana, może wpłynąć na dostępne pliki wydania, to interesujące.os-release
nie zawiera pełnego numeru wersji zdebian_version
. Zobacz unix.stackexchange.com/questions/382531 .Jeśli nie możesz lub nie chcesz używać pliku wydania LSB (ze względu na zależności, które wprowadza pakiet), możesz poszukać plików wydania specyficznych dla dystrybucji. Bcfg2 ma sondę dla dystrybucji, której możesz użyć: http://trac.mcs.anl.gov/projects/bcfg2/browser/doc/server/plugins/probes/group.txt
źródło
2 sposoby z wielu:
1) użyj
Przetestowałem to na CentOS 5.5 i Ubuntu 10.04
wyjście dla CentOS to:
a dla Ubuntu jest:
2) wprowadź następujące polecenie:
Przetestowałem to na CentOS 5.5 i Ubuntu 10.04 i działa dobrze.
źródło
Ten skrypt działa na Debianie (może wymagać drobnych poprawek w Ubuntu)
źródło
Oto moja prosta wersja chech_distro. ^^;
źródło
Bez wersji wystarczy tylko dist:
źródło
Zostało to przetestowane na Ubuntu 14 i CentOS 7
źródło
sed -n -e '/PRETTY_NAME/ s/^.*=\|"\| .*//gp' /etc/os-release
Znajduję stąd dobry skrypt , który działa na większość popularnych Linuksów:
źródło
Używam narzędzia skryptowego Screenfetch :
źródło
Jest rubinowy klejnot faktera , który podaje kilka faktów na temat systemu operacyjnego, analizuje pliki wersji systemu operacyjnego, inne dane i drukuje na ekranie terminala. Możesz spróbować w następujący sposób, zaczynając od instalacji rubygemów:
Użyj powyższego przypadku, który jest odpowiedni dla twojego systemu operacyjnego. Następnie zainstaluj sam klejnot.
Następnie użyj:
UWAGA: Zobacz źródła klejnotów w celu uzyskania dodatkowych informacji podczas instalacji.
źródło
Jeśli ktoś również potrzebuje dystrybucji:
Wynik:
Zmień na: lsb_release -sc, aby uzyskać dystrybucję:
Wynik:
źródło
To polecenie działa w przypadku dystrybucji opartych na Debianie i Redhat: Korzystając z
tr
filtra, konwertujesz dokument do formatu jednego słowa na linię, a następnie zliczasz pierwszy wiersz zawierający nazwę dystrybucji.źródło
/etc/issue
nie zawierała wersji ani nazwy na zenwalk. Jest to plik, który można modyfikować przez administratora, zawierający komunikat prezentowany ludziom, który nie ma gwarancji, że zawiera wszystko , co można wyciągnąć programowo.