Saya ingin menyimpan .bashrc
dan .bash_login
file saya dalam kontrol versi sehingga saya dapat menggunakannya di antara semua komputer yang saya gunakan. Masalahnya adalah saya memiliki beberapa alias khusus OS, jadi saya mencari cara untuk menentukan apakah skrip berjalan pada Mac OS X, Linux atau Cygwin .
Apa cara yang tepat untuk mendeteksi sistem operasi dalam skrip Bash ?
bash
os-detection
csexton
sumber
sumber
Jawaban:
Saya pikir yang berikut ini harus bekerja. Saya tidak yakin tentang itu
win32
.sumber
msys
untuk Git Bash / msysGit, dancygwin
untuk Cygwinmsys
;
.source somefile ;
, saya dapatkansyntax error near unexpected token elif
.Untuk .bashrc saya, saya menggunakan kode berikut:
Kemudian saya melakukan sesuatu seperti:
Itu jelek, tapi berhasil. Anda dapat menggunakan
case
daripadaif
jika Anda inginkan.sumber
platform="$(uname | tr '[:upper:]' '[:lower:]')"
dan kemudian pasti menangani suatu kasus? Sepertinya aneh untuk hardcode ketergantungan pada output yang sangat spesifik.Manual bash mengatakan bahwa variabel OSTYPE menyimpan nama sistem operasi:
Sudah diatur di
linux-gnu
sini.sumber
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
Anda cukup menggunakan
$OSTYPE
variabel yang sudah ditentukan, misalnya:Namun itu tidak dikenali oleh cangkang yang lebih lama (seperti cangkang Bourne ).
uname
Metode lain adalah mendeteksi platform berdasarkan
uname
perintah.Lihat skrip berikut (siap untuk disertakan dalam .bashrc):
Anda dapat menemukan beberapa contoh praktis di blog saya
.bashrc
.Ini adalah versi yang mirip dengan yang digunakan pada Travis CI :
sumber
uname
, Oracle telah mengkilap konvensi dan meletakkan string versi gratis dengan merekaOSTYPE ==> solaris2.11
.uname
sedikit lebih bersih dan lebih sedikit pekerjaan yang harus dilakukan.Mendeteksi sistem operasi dan jenis CPU tidak begitu mudah dilakukan portable . Saya memiliki
sh
skrip sekitar 100 baris yang bekerja di beragam platform Unix yang sangat luas: sistem apa pun yang telah saya gunakan sejak 1988.Elemen kuncinya adalah
uname -p
adalah jenis prosesor tetapi biasanyaunknown
pada platform Unix modern.uname -m
akan memberikan "nama perangkat keras mesin" pada beberapa sistem Unix./bin/arch
, jika ada, biasanya akan memberikan jenis prosesor.uname
tanpa argumen akan memberi nama sistem operasi.Akhirnya Anda harus memikirkan perbedaan antara platform dan seberapa baik Anda ingin membuatnya. Misalnya, hanya untuk menjaga hal-hal sederhana, saya memperlakukan
i386
melaluii686
, setiap "Pentium*
" dan setiap "AMD*Athlon*
" semua sebagaix86
.Saya
~/.profile
menjalankan skrip saat startup yang menetapkan satu variabel ke string yang menunjukkan kombinasi CPU dan sistem operasi. Saya memiliki platform-spesifikbin
,man
,lib
, daninclude
direktori yang mendapatkan dibentuk berdasarkan itu. Kemudian saya menetapkan variabel lingkungan boatload. Jadi misalnya, skrip shell untuk memformat ulang surat dapat memanggil, misalnya,$LIB/mailfmt
yang merupakan biner yang dapat dieksekusi platform-spesifik.Jika Anda ingin mengambil jalan pintas ,
uname -m
dan polosuname
akan memberi tahu Anda apa yang ingin Anda ketahui di banyak platform. Tambahkan hal-hal lain saat Anda membutuhkannya. (Dan gunakancase
, tidak bersarangif
!)sumber
uname -s
?Saya merekomendasikan untuk menggunakan kode bash lengkap ini
lebih banyak contoh contoh di sini: https://github.com/coto/server-easy-install/blob/master/lib/core.sh
sumber
ls /etc
dan mencari "blah-release" - apa pun bla itu, itulah OS Linux - CentOS, Ubuntu , dllDalam bash, gunakan
$OSTYPE
dan$HOSTTYPE
, seperti yang didokumentasikan; Inilah yang saya lakukan. Jika itu tidak cukup, dan jika bahkanuname
atauuname -a
(atau opsi lain yang sesuai) tidak memberikan informasi yang cukup, selalu ada skrip config.guess dari proyek GNU, dibuat persis untuk tujuan ini.sumber
Saya sarankan menghindari beberapa jawaban ini. Jangan lupa bahwa Anda dapat memilih bentuk perbandingan string lain, yang akan menghapus sebagian besar variasi, atau kode jelek yang ditawarkan.
Salah satu solusi tersebut adalah pemeriksaan sederhana, seperti:
if [[ "$OSTYPE" =~ ^darwin ]]; then
Yang memiliki manfaat tambahan untuk mencocokkan versi Darwin apa pun, meskipun sufiks versi itu. Ini juga berfungsi untuk variasi yang
Linux
diharapkan.Anda dapat melihat beberapa contoh tambahan dalam dotfile saya di sini
sumber
Coba gunakan "uname". Misalnya, di Linux: "uname -a".
Menurut halaman buku panduan, uname sesuai dengan SVr4 dan POSIX, jadi itu harus tersedia di Mac OS X dan Cygwin juga, tapi saya tidak bisa memastikannya.
BTW: $ OSTYPE juga disetel ke
linux-gnu
sini :)sumber
Saya menulis gula ini di
.bashrc
:Jadi saya bisa melakukan hal-hal seperti:
sumber
if_nix gnu
&if_os linux
.echo $OSTYPE
. Untuk mendeteksi win 10 subsistem bash secara khusus, satu-satunya solusi yang saya temukan adalah memeriksa "Microsoft" di/proc/sys/kernel/osrelease
atau
jika Anda menginginkan informasi lebih lanjut
sumber
Saya menulis perpustakaan Bash pribadi dan kerangka kerja skrip yang menggunakan GNU shtool untuk melakukan deteksi platform yang agak akurat.
GNU shtool adalah sekumpulan skrip yang sangat portabel yang berisi, di antara hal-hal lain yang bermanfaat, perintah 'platform shtool'. Ini adalah output dari:
pada beberapa mesin yang berbeda:
Ini menghasilkan hasil yang cukup memuaskan, seperti yang Anda lihat. GNU shtool agak lambat, jadi saya benar-benar menyimpan dan memperbarui identifikasi platform dalam file di sistem yang dipanggil oleh skrip saya. Ini kerangka saya, jadi itu berfungsi untuk saya, tetapi jarak tempuh Anda mungkin berbeda.
Sekarang, Anda harus menemukan cara untuk mengemas shtool dengan skrip Anda, tetapi ini bukan latihan yang sulit. Anda selalu dapat kembali menggunakan output yang tidak sama.
EDIT:
Saya melewatkan posting oleh Teddy tentang
config.guess
(entah bagaimana). Ini adalah skrip yang sangat mirip, tetapi tidak sama. Saya pribadi menggunakan shtool untuk kegunaan lain juga, dan itu sudah bekerja dengan baik untuk saya.sumber
Anda dapat menggunakan yang berikut ini:
maka Anda dapat menggunakan variabel OS dalam skrip Anda.
sumber
uname -s
perbedaannyauname
?Di bawah ini adalah pendekatan untuk mendeteksi OS Linux berbasis Debian dan RedHat dengan menggunakan / etc / lsb-release dan / etc / os-release (tergantung pada rasa Linux yang Anda gunakan) dan lakukan tindakan sederhana berdasarkan itu.
Contoh keluaran untuk Ubuntu Linux:
sumber
Ini harus aman digunakan di semua distro.
Ini menghasilkan sesuatu seperti ini.
Ekstrak / tetapkan ke variabel sesuai keinginan
Catatan: Pada beberapa pengaturan. Ini juga dapat memberi Anda beberapa kesalahan yang dapat Anda abaikan.
sumber
[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
coba ini:
sumber
cat: /etc/*-release: No such file or directory
zsh: no matches found: /etc/*release
- ini hanya akan bekerja untuk sistem linux, saya kira ...Anda dapat menggunakan berikut ini jika klausa dan perluas sesuai kebutuhan:
sumber
Saya mencoba pesan-pesan di atas di beberapa distro Linux dan menemukan yang berikut ini berfungsi paling baik untuk saya. Ini adalah jawaban kata singkat dan ringkas yang bekerja untuk Bash di Windows juga.
sumber
OS=$( ([[ -f /etc/*release ]] && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || echo "Unknown" )
ini akan berfungsi tanpa membuang kesalahan.OS=$( $(compgen -G "/etc/*release" > /dev/null) && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || $( echo "${OSTYPE//[0-9.]/}")
Saya cenderung menyimpan .bashrc dan .bash_alias pada file yang dapat diakses semua platform. Inilah cara saya mengatasi masalah di .bash_alias saya:
Dan saya punya contoh .bash_alias_Linux dengan:
Dengan cara ini saya menjaga platform khusus dan kode portabel terpisah, Anda dapat melakukan hal yang sama untuk .bashrc
sumber
Ini memeriksa banyak
known
file yang akan dikenali jika distro linux adalah Debian atau Ubunu, maka distro default ke$OSTYPE
variabel.sumber
Melakukan hal berikut membantu melakukan pemeriksaan dengan benar untuk ubuntu:
sumber