Saya menginstal program besar, yang memiliki sumber dayanya sebagai rpm
file. Itu terjebak di garis
#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]
Rupanya, sh
bekerja untuk bash
di Red Hat Linux dengan sintaks ini, tetapi memberikan kesalahan unexpected operator
di Ubuntu.
Saya tidak dapat mengubah skrip bash
karena skrip berasal dari rpm
paket. Saya dapat mengekstrak dan mengemas ulang rpm
paket tersebut, tetapi mungkin ada banyak skrip seperti itu.
Apakah ada cara untuk mengubah shell default untuk diperlakukan #!/bin/sh
sebagai bash
atau apa pun, yang dapat menangani [
operator?
==
yang seharusnya=
. Itu, dan bahwa ekspansi variabel harus dikutip ganda.[
bukan operator, tetapi perintah builtin yang dipanggiltest
. Operator yang tidak terduga adalah==
dan ini harus diganti oleh=
karena tidak sesuai dengan POSIX.$SCITEGICPERLHOME
harus dikutip.#!/bin/sh
, mereka harus memastikan mereka hanya menggunakan fitur shell POSIX, bukanbash
ekstensi. Programmer ini sangat ceroboh. Dia harus memperbaiki kodenya atau menggunakannya#!/bin/bash
.Jawaban:
Ada beberapa program yang mengimplementasikan bahasa
/bin/sh
. Di Ubuntu,/bin/sh
adalah dash, yang dirancang untuk menjadi cepat, untuk menggunakan sejumlah kecil memori, dan tidak mendukung lebih dari yang diharapkan/bin/sh
. Di RHEL,/bin/sh
adalah bash, yang lebih lambat dan menggunakan lebih banyak memori tetapi memiliki lebih banyak fitur. Salah satu fitur ini adalah==
operator untuk[
sintaksis bersyarat. Dukungan Dash[
, yang merupakan fitur sh dasar, tetapi tidak memiliki==
operator yang merupakan ekstensi bash (dan ksh dan zsh).Anda dapat mengganti sistem Anda untuk menggunakan bash. Di Ubuntu,
/bin/sh
adalah tautan simbolis kedash
. Anda dapat menjadikannya sebagai tautan simbolisbash
. Versi Debian dan Ubuntu saat ini (dan turunannya) menjadikan ini opsi pemasangan dasbor. Untuk mengubahnya, jalankandan jawab "ya" untuk tetap berlari sebagai
/bin/sh
atau "tidak" untuk beralih ke bash.Anda dapat menyimpan bash sebagai
/bin/sh
, tetapi itu akan membuat sistem Anda sedikit lebih lambat. Bahkan dapat dibayangkan bahwa beberapa skrip sistem tidak kompatibel dengan bash, walaupun itu tidak mungkin karena bash sebagian besar adalah superset dari dash.Untuk distribusi yang tidak memiliki antarmuka untuk memilih antara implementasi
/bin/sh
, berikut ini cara beralih ke bash.Biarkan terminal terbuka dan periksa apakah Anda masih dapat menjalankan beberapa
sh
skrip setelah itu. Jika Anda mengacaukan perintah ini, itu akan membuat sistem Anda tidak dapat digunakan. (Ngomong-ngomong, alasan saya menggunakan banyak perintah di atas daripada yang terlihat langsungsudo ln -sf bash /bin/sh
adalah karenaln -sf
itu bukan atom. Dalam kasus yang tidak disangka komputer Anda mengalami crash selama operasi ini, Anda harus mem-boot dari media cadangan untuk memulihkannya. Sebaliknya,mv
adalah atomik.)Untuk mengembalikan tanda hubung sebagai
/bin/sh
:Perhatikan bahwa jika sh secara
/bin/bash
default pada distribusi Anda, beralih ke tanda hubung dapat menyebabkan skrip gagal, karena bash memiliki lebih banyak fitur daripada tanda hubung. Skrip Bash harus dimulai dengan#!/bin/bash
, dan skrip dimulai dengan#!/bin/sh
tidak boleh menggunakan fitur spesifik bash, tetapi distribusi yang dikirimkan dengan bash/bin/sh
mungkin menggunakan fitur spesifik bash dalam#!/bin/sh
skrip yang khusus untuk distribusi itu (tidak apa-apa asalkan tidak ada harapan bahwa pengguna dapat beralih ke dasbor karena/bin/sh
dan tidak ada harapan bahwa skrip ini berfungsi pada distribusi lain).sumber
/bin/sh
Bash, itu adalah bug baik dalam sistem (paket dengan skrip), atau dalamsh
-mode Bash . Seperti kata Stephen, sistem secara eksplisit memungkinkan untuk mengatur/bin/sh
kembali ke Bash, viadpkg-reconfigure
. Ini juga disebutkan sebagai kemungkinan dalam wiki Ubuntu dalam hal ini: wiki.ubuntu.com/DashAsBinSh/bin/sh
bash, ini adalah bug. Namun, bug terjadi. Saya sarankan tetap menggunakan default jika Anda tidak mampu dan mau mendiagnosis bug tersebut karena orang lain telah mengujinya untuk Anda. Saya menggunakan tanda hubung seperti/bin/sh
sebelumnya secara resmi didukung pada Debian, tetapi ini adalah risiko yang saya ambil, tahu bahwa saya dapat mengatasinya jika sesuatu terjadi.debconf
waktu berikutnyadash
diperbarui; harus diakui ini tidak akan sering terjadi (jika sama sekali, dalam rilis yang diberikan) untuk sistem yang menjalankan Debian stable.Untuk beralih
sh
kebash
(alih-alihdash
, default), konfigurasi ulangdash
(ya, ini agak kontra-intuitif):Ini akan menanyakan apakah Anda ingin
dash
menjadi shell sistem default; jawab "Tidak" ( Tablalu Enter) danbash
akan menjadi default sebagai gantinya ( yaitu/bin/sh
akan menunjuk ke/bin/bash
).sumber