Saya memiliki perangkat lunak yang /bin/sh
harus Bash, tetapi untuk Ubuntu defaultnya adalah Dash dan saya ingin tetap menggunakannya sebagai default; Saya tidak ingin mengubahnya ke Bash secara permanen.
Apakah ada cara untuk mengubahnya hanya untuk sesi terminal berjalan? Jadi program yang berjalan di terminal ini akan melihat /bin/sh
ditautkan ke bash tetapi sisa sistem masih akan melihat Dash? Atau bisa saya mengelabui perangkat lunak untuk melihat /bin/sh
seperti Bash bahkan jika tidak nya?
Saya tidak menulis perangkat lunak ini dan meretasnya untuk digunakan, /bin/bash
bukan /bin/sh
benar-benar pilihan.
command-line
bash
sh
corwin
sumber
sumber
/bin/sh
adalahbash
adalah bug, dan hal itu menyebabkan masalah yang sebenarnya (karena Anda mencari tahu). Jika tidak ada yang mengeluh, itu mungkin tidak akan pernah berubah.Jawaban:
Dua jawaban sudah menyarankan chroot dan mengikat mount, dan ada opsi ketiga, terkait erat: mount namespaces . Menggunakan
unshare
program ini , Anda dapat membuat mount namespace baru, dan mount dalam namespace ini tidak akan memengaruhi ruang nama lain.Sebagai contoh, dalam satu terminal, saya lakukan:
Dan di tempat lain:
Jadi Anda bisa menjalankan program tidak fleksibel ini di mount namespace-nya sendiri.
sumber
Jika ini skrip, panggil saja skrip tersebut sebagai
Tidak perlu mengubah tautan sama sekali.
Untuk file executable yang bisa dieksekusi, Anda bisa menggunakan chroot route:
Dan kemudian jalankan program Anda atau
sudo chroot rootfs /yourprogram
Namun, dalam praktiknya tidak ada alasan mengapa Anda tidak dapat menggunakan
/bin/bash
sebagai symlink/bin/sh
. Bahkan, sebelum versi 6.10 Ubuntu digunakan/bin/bash
sebagai/bin/sh
, dan kemudian mereka beralih karena/bin/sh
menjadi lebih cepat, implementasi lebih ramping dari POSIX/bin/sh
(yaitu, mematuhi standar POSIX untuk bagaimana utilitas sistem operasi dan sistem operasi Unix-like dan OS harus berperilaku dan mengimplementasikan beberapa internal mereka), dan karena alasan portabilitas. Saya sangat merekomendasikan membaca jawaban Gilles juga untuk catatan sejarah tentang bagaimana hal itu/bin/dash
terjadi. Adapun kompatibilitas, skrip yang ditulis untukdash
menggunakan fitur POSIX akan berjalan denganbash
menjadi shell default baik-baik saja. Biasanya, sebaliknya yang menyebabkan masalah -bash
memiliki fitur yang tidak diperlukan oleh/bin/sh
, seperti<<<
sintaks atau array.Selain itu, perintah yang dimaksud mungkin ditulis dengan RHEL atau CentOS dalam pikiran, yang memang digunakan
/bin/bash
sebagai symlink/bin/sh
, menyarankan dua hal: mereka mungkin menargetkan OS tertentu dan tidak mematuhi prinsip-prinsip POSIX. Dalam hal ini, itu juga merupakan ide yang baik untuk memeriksa hal-hal lain yang diperlukan oleh perintah, karena jika itu benar-benar ditulis dengan OS lain dalam pikiran, Anda mungkin mengalami lebih banyak masalah daripada hanya menghubungkan kembali/bin/sh
.sumber
ln
ataucp -l
).mount --rbind --make-rslave
daripadacp -r
. Dapat dibuat hanya-baca juga. Jugasudo chroot
menjalankan skrip sebagai root yang mungkin tidak optimal.Satu kemungkinan akan menjadi bind mount dari satu file. Untuk melakukan ini, Anda memasang file
/bin/bash
di atas/bin/dash
sehinggabash
semacam penutup atau menyembunyikandash
. Berikut langkah-langkahnya (termasuk sebaliknya):Saya tidak mencoba untuk menyembunyikan symlink
mount --bind /bin/bash /bin/sh
secara langsung . Trik di atas hanya membuat bash dan dash identik sehingga merujuk meskipun menunjuk ke . Juga, ini adalah solusi seluruh sistem, tidak hanya untuk jendela terminal saat ini.mount
sh
bash
dash
Saya harus akui, ini mungkin berlebihan dan hanya mengubah symlink sementara jauh lebih mudah. Saya hanya ingin menunjukkan cara lain yang mungkin.
sumber
Anda harus dapat mengubahnya hanya untuk sesi saat ini dengan menggunakan alias. Sebelum menjalankan perintah Anda di terminal:
Ini bersifat sementara dan hanya aktif di terminal dari mana ia dieksekusi.
NAMUN: Ini TIDAK AKAN BEKERJA jika skrip Anda menggunakan jalur absolut.
Sayangnya, "meretas" skrip mungkin satu-satunya pilihan Anda. Per obrolan dengan @vanadium, Anda dapat membuat skrip pembungkus seperti ini:
Namun, selama durasi skrip Anda, Anda lebih baik berharap tidak ada pada sistem Anda secara eksplisit membutuhkan tanda hubung.
sumber