Dari Perbedaan antara bash dan sh :
Abaikan pertanyaan: Jika Anda memiliki
/bin/sh
tautan ke bash, maka bash tidak akan berperilaku sama ketika dipanggil seperti/bin/sh
halnya ketika dipanggil sebagai/bin/bash
. Ketika dipanggil sebagaish
, itu akan membatasi dirinya untuk sebagian besar kepatuhan POSIX plus satu set ekstensi terbatas.
Apakah ini berarti bahwa setiap kali saya menemukan skrip shell di Linux dengan shebang to sh:, #!/bin/sh
bahkan jika pada distro itu, bin/sh
adalah symlink ke shell lain, seperti dash atau bash, itu harus 100% kompatibel dengan bourne shell, karena itu membatasi dirinya untuk satu set ekstensi terbatas? Jadi saya bisa menjalankannya di FreeBSD? Apakah ada pengecualian untuk itu? Atau saya harus aman untuk berasumsi bahwa itu akan berhasil?
Jadi jika pada distro, bin/sh
apakah symlink bin/bash
, dan skrip menggunakan #!/bin/sh
dan skrip berisi bashism, itu tidak akan berjalan, karena bash akan suka berada dalam mode sh?
sumber
/bin/sh
sebagai shebang. Script shell masih dapat digunakan secara eksplisit/bin/bash
. Bagaimanapun sebagian besar skrip shell mungkin akan berjalan dengan baik di bawah / bin / sh tetapi masalahnya adalah alat pengguna, misalnya kebanyakan skrip shell mengharapkan GNU userland yang mungkin akan lebih menjadi masalah daripada hanya beberapa kesalahan sintaksis. Saya juga menambahkan tautan ke referensi bash yang mencantumkan perilaku yang berbeda dalam modeTampaknya ada beberapa kebingungan di sekitar kulit Bourne. Shell Bourne adalah shell Unix beberapa dekade yang lalu, pada masa pra-POSIX. Saat ini "sh" adalah implementasi atau yang lain dari shell yang mengimplementasikan spesifikasi POSIX, di antaranya kami memiliki bash, pdksh, AT&T ksh, shell Almquist yang lebih baru dan turunannya yang telah dibuat sesuai dengan POSIX (termasuk "sh" dari beberapa BSDs , BSD lain yang didasarkan pada pdksh dan abu Debian (tanda hubung)). Bahkan zsh memiliki mode yang sebagian besar sesuai dengan POSIX.
Shell Bourne tidak kompatibel dengan POSIX, dan tidak dapat ditemukan di banyak sistem saat ini. Di mana shell Bourne ditemukan atau di mana tidak, selalu akan ada "sh" yang sesuai dengan POSIX (dan tidak akan menjadi shell Bourne), umumnya
/bin
sementara pengecualian yang menonjol (menjengkelkan) adalah Solaris.Perhatikan bahwa sebelum shell Bourne, dan kita berbicara lebih dari 30 tahun yang lalu, "sh" adalah shell Thompson. Kami tidak lagi menulis skrip yang kompatibel dengan shell Thompson. Demikian pula, kita harus berhenti menganggap "sh" sebagai cangkang Bourne.
Sekarang "sh" adalah spesifikasi, tidak banyak varian implementasi yang tidak kompatibel. Itu membuatnya jauh lebih mudah untuk menulis skrip portabel. Ikuti saja spesifikasinya .
Itu berlaku untuk "sh" dan semua utilitas standar (sed, cut, tr ...)
sumber
sed -r
. Pada sistem dengan utilitas berbasis BSD, Anda gunakansed -E
. FreeBSD's sed menerima keduanya, tetapi Mac OS X hanya menerima-E
. Dan seterusnya dan seterusnya.\(...\)\1
tidak memiliki terjemahan dalam ERE standar).\|
BRE. Saya semua untuk menulis portable mungkin. Saya hanya melakukan pengamatan (saya pikir sangat dihargai) bahwa ini bisa menyakitkan, dan kadang-kadang menulis ke POSIX sama sekali tidak mungkin. Di suatu tempat ada tautan yang menunjukkan banyak penyimpangan seperti itu; akan mencari mereka.${VAR:=stuff...here}
tetapi banyak shell tidak membiarkan Anda, Anda harus memberi tanda kutipstuff...here
.