Saya sedang mengerjakan skrip bash sederhana yang seharusnya dapat berjalan di distribusi Ubuntu dan CentOS (dukungan untuk Debian dan Fedora / RHEL akan menjadi nilai tambah) dan saya perlu tahu nama dan versi distribusi skrip yang sedang dijalankan ( untuk memicu tindakan tertentu, misalnya pembuatan repositori). Sejauh ini yang saya dapat adalah ini:
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
Ini sepertinya berhasil, kembali ubuntu
atau centos
(saya belum mencoba yang lain) sebagai nama rilis. Namun, saya punya perasaan bahwa harus ada cara yang lebih mudah, lebih dapat diandalkan untuk menemukan ini - apakah itu benar?
Itu tidak bekerja untuk RedHat. / etc / redhat-release mengandung: Redhat Linux Entreprise release 5.5
Jadi, versi ini bukan kata ketiga, Anda sebaiknya menggunakan:
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
berhasil? Secara efektif Anda mencari dengan asumsi itu akan/etc/lsb-release
, jadi mungkin sebut saja itu.*
dengan+
untuk menghindari pembentukan komentar, seharusnyaetc/*-release
, sepertinya berhasil.uname -rv | grep -i "name_of_distro"
dan menggunakan kode keluar?Jawaban:
Untuk mendapatkan
OS
danVER
, tampaknya standar terbaru/etc/os-release
. Sebelum itu, adalsb_release
dan/etc/lsb-release
. Sebelum itu, Anda harus mencari file yang berbeda untuk setiap distribusi.Inilah yang saya sarankan
Saya pikir
uname
untuk mendapatkanARCH
masih merupakan cara terbaik. Tetapi contoh yang Anda berikan jelas hanya menangani sistem Intel. Saya akan menyebutnyaBITS
seperti ini:Atau ubah
ARCH
menjadi versi yang lebih umum, namun tidak ambigu:x86
danx64
atau serupa:tapi tentu saja itu terserah kamu.
sumber
-
dan_
? Mungkin di/lib/lsb
atau di suatu tempat seperti itu. Apa yangrpm -qa "lsb*"
dicetak?rpm -qa "lsb*
tidak mencetak apa pun. Menurutnyayum provides */lsb_release
terkandung dalam paket yang disebut redhat-lsb yang saya kira tidak diinstal secara default. Namun, saya bukan ahli Fedora, ini hanya hasil dari Fedora VM acak yang saya miliki dan bisa sangat salah.lsb-release
, seperti yang Anda katakan.$OS
,,$VERSION
dll - dengan konvensi, kami menggunakan huruf besar untuk variabel lingkungan (PAGER, EDITOR, SHELL, ...) dan variabel shell internal (BASH_VERSION, RANDOM, ...). Semua nama variabel lainnya harus mengandung setidaknya satu huruf kecil. Konvensi ini menghindari variabel lingkungan dan internal yang secara tidak sengaja diabaikan.Saya akan menggunakan ini sebagai langkah pertama:
Gentoo, RedHat, Arch & SuSE memiliki file bernama eg
/etc/gentoo-release
. Tampaknya menjadi populer, periksa situs ini tentang rilis file .Debian & Ubuntu harus memiliki
/etc/lsb-release
yang berisi info rilis juga, dan akan muncul dengan perintah sebelumnya.Yang cepat lainnya adalah
uname -rv
. Jika kernel yang dipasang adalah kernel distro,biasanyaAnda akan menemukan nama di sana.sumber
uname -a
.uname -rv
mengandung info?uname -a
akan mencetak hal-hal seperti jenis prosesor dan nama host yang tidak relevan di sini. (Tetapi kedua rilis kernel (-r
) dan versi (-v
) diperlukan, tidak semua distro melakukan hal yang sama di sana)2.6.32-5-686-bigmem
dan uname -v memberi#1 SMP Tue Mar 8 22:14:55 UTC 2011
pada Debian 6. uname -a OTOH memberiLinux debian 2.6.32-5-686-bigmem #1 SMP Tue Mar 8 22:14:55 UTC 2011 i686 GNU/Linux
.uname -a
adalah-n
, yaitu nodename == nama host. jadi saya katakanuname
tidak akan menarik pada Debian. Kalau dipikir-pikir, saya tidak yakin itu sangat berguna pada RedHat juga.debian
,.lsb_release -a
. Bekerja pada Debian dan saya kira Ubuntu, tapi saya tidak yakin tentang sisanya. Biasanya itu harus ada di semua distribusi GNU / Linux karena terkait dengan LSB (Linux Standard Base).sumber
Satu-liner, fallback, satu garis output, tidak ada kesalahan.
sumber
atau hanya
sumber
Ambil kiat dari pengembang javascript. Jangan menguji versi, uji kemampuan. Itu tidak cantik, tetapi berhasil. Perluas sesuai kebutuhan.
sumber
Agar sukses yang paling mungkin terjadi, ini:
mencakup sebagian besar kasus (AFAIK): Debian, Ubuntu, Slackware, Suse, Redhat, Gentoo, * BSD dan mungkin yang lainnya.
sumber
cat /etc/*version
tidak berfungsi (tidak ada file seperti itu) di CentOS (setidaknya pada 6.4)Untuk sebagian besar sistem OS Linux modern, file
/etc/os-release
ini benar-benar menjadi standar dan dimasukkan dalam sebagian besar OS. Jadi di dalam skrip Bash Anda, Anda hanya bisa memasukkan file, dan Anda akan memiliki akses ke semua variabel yang dijelaskan di sini (misalnya: NAME, VERSION, ...)Jadi saya hanya menggunakan ini dalam skrip Bash saya:
sumber
Jika file
/etc/debian_version
ada, distribusinya adalah Debian, atau turunan Debian. File ini mungkin memiliki nomor rilis; pada mesin saya saat ini6.0.1
. Jika sedang diuji atau tidak stabil, itu mungkin mengatakan pengujian / tidak stabil, atau mungkin memiliki nomor rilis yang akan datang. Kesan saya adalah bahwa pada Ubuntu setidaknya, file ini selalu diuji / tidak stabil, dan bahwa mereka tidak memasukkan nomor rilis di dalamnya, tetapi seseorang dapat memperbaiki saya jika saya salah.Fedora (setidaknya rilis terbaru), memiliki file serupa, yaitu
/etc/fedora-release
.sumber
/etc/debian_version
dan/etc/os-release
./etc/debian_version
file. Jadi cara kami mempersiapkan instalasi Debian dapat memengaruhi file rilis yang tersedia, itu menarik.os-release
tidak menyertakan nomor versi lengkap daridebian_version
. Lihat unix.stackexchange.com/questions/382531 .Jika Anda tidak dapat atau tidak ingin menggunakan file rilis LSB (karena dependensi yang dibawa paket), Anda dapat mencari file rilis khusus distro. Bcfg2 memiliki probe untuk distro yang mungkin dapat Anda gunakan: http://trac.mcs.anl.gov/projects/bcfg2/browser/doc/server/plugins/probes/group.txt
sumber
2 cara dari banyak:
1) gunakan
Saya mengujinya pada CentOS 5.5 dan Ubuntu 10.04
output untuk CentOS adalah:
dan untuk Ubuntu adalah:
2) masukkan perintah berikut:
Saya mengujinya pada CentOS 5.5 dan Ubuntu 10.04, dan berfungsi dengan baik.
sumber
Skrip ini berfungsi pada Debian, (mungkin perlu beberapa penyesuaian pada Ubuntu)
sumber
Ini adalah versi chech_distro sederhana saya. ^^;
sumber
Tanpa versi, hanya dist:
sumber
Ini diuji pada Ubuntu 14 dan CentOS 7
sumber
sed -n -e '/PRETTY_NAME/ s/^.*=\|"\| .*//gp' /etc/os-release
Saya menemukan skrip yang bagus dari sini yang berfungsi untuk sebagian besar distro linux yang umum:
sumber
Saya menggunakan utilitas skrip screenfetch :
sumber
Ada permata ruby facter , yang memberi Anda beberapa fakta tentang OS os, itu menganalisis file rilis OS, data lain dan cetakan ke layar terminal. Anda dapat mencoba sebagai berikut, dimulai dengan instalasi rubygems:
Silakan gunakan case di atas yang memenuhi syarat untuk OS Anda. Kemudian instal permata itu sendiri.
Kemudian gunakan:
CATATAN: Lihat sumber permata facter untuk mendapatkan info lebih lanjut dalam pemasangan.
sumber
Jika seseorang membutuhkan distro juga:
Keluaran:
Ubah ke: lsb_release -sc untuk mendapatkan distro:
Keluaran:
sumber
Perintah ini berfungsi untuk distribusi berbasis Debian dan Redhat: Menggunakan
tr
filter, Anda mengonversi dokumen ke format satu kata per baris dan kemudian menghitung baris pertama yang berisi nama distribusi.sumber
/etc/issue
tidak mengandung versi atau nama di zenwalk. Ini adalah file yang dapat dimodifikasi administrator yang berisi pesan yang disajikan kepada manusia yang tidak memiliki jaminan mengandung apa pun yang dapat ditarik secara programatik.