Saya melihat dua jenis kode yang digunakan:
#!/usr/bin/sh
dan:
#!/user/bin/bash
Saya mencari ini secara online dan pendapatnya sangat bervariasi. Penjelasan yang saya lihat di sebagian besar situs web mengatakan bahwa sh
itu lebih tua dari bash
, dan bahwa tidak ada perbedaan nyata.
Apakah ada yang tahu perbedaannya? Bisakah Anda memberi saya contoh praktis kapan harus menggunakannya?
sh
danbash
): http://en.wikipedia.org/wiki/Comparison_of_command_shellsJawaban:
bash
adalah supersetsh
yaitu. segala sesuatu yang dapat Anda lakukan dish
dapat Anda lakukan dibash
.Bash memiliki lebih banyak fitur (percabangan, builtin, array) yang membuat skrip lebih mudah untuk ditulis. Beberapa nanti * nix'es memiliki
/bin/sh
tautan ke/bin/bash
Untuk penjelasan lengkap tentang apa ini tutorial
sumber
sh
) tidak hanya diperpanjang adalah bahwa Bash` ditulis oleh orang lain. Saya juga bertaruh ada masalah lisensi. Baca artikel tentang Bourne Shell en.wikipedia.org/wiki/Bourne_shellsh
akan memecah banyak skrip yang mengharapkannya ada di sana dan bergantung pada cara mem-parsing sesuatu. Pengguna Linux mungkin tidak peduli, tetapi orang-orang yang menghabiskan $$ ribuan untuk Solaris, AIX atau HP-UX mungkin sangat terganggu.sh
tidak diperpanjang: kode sumbernya adalah neraka murni. Lihatlah. Ini seharusnya menjadi C ...Secara tradisional, / bin / sh akan menjadi shell Bourne asli, yang tidak memiliki pengeditan histori atau baris perintah, dan tidak ada kontrol pekerjaan.
Selama sekitar 15 tahun terakhir, sebagian besar Unix telah memiliki shell POSIX diinstal, atau setidaknya ksh atau bash (yang sangat mirip POSIX), tetapi masih memiliki shell yang lebih terbatas di / bin / sh
Alasannya adalah agar skrip shell lama yang mengharapkan
sh
perintah yang lebih lama masih berfungsi.Karena karakter suka
{
,}
dan!
memiliki arti khusus untuk mem-bash, mungkin saja skrip shell lama yang menggunakan karakter tersebut (tanpa melarikan diri) dapat gagal.(Shell Bourne akan mengambil
!!{1,2}
secara harfiah, sedangkan bash akan menafsirkannya sebagai pengulangan dari perintah sebelumnya (!!
) diikuti oleh brace-ekspansi).Di Linux,
sh
perintahnya hampir selalu hanya berupa tautanbash
, dengan semua fitur yang sama.sumber
sh dapat berarti shell Bourne atau / bin / sh, yang merupakan shell (POSIX-conformant) lainnya pada kebanyakan platform modern. "Shell POSIX" adalah shell abstrak yang didefinisikan oleh POSIX , yang diimplementasikan oleh bash dalam mode POSIX, atau ksh atau dash secara default. / bin / sh kadang-kadang juga disebut shell POSIX, karena itu adalah shell yang sesuai dengan POSIX pada kebanyakan platform. Kerang Bourne asli bukan kerang POSIX.
bashref memiliki daftar perbedaan antara bash dan cangkang Bourne .
man bash
memiliki daftar perubahan saat bash dipanggil dalam mode POSIX ./ bin / sh bukan symlink atau hard link pada OS X, tapi ukurannya hampir sama dengan / bin / bash:
man bash :
Peniruan cangkang Bourne sebaliknya sangat terbatas.
bash +B
(Bourne) sebenarnya akan menonaktifkan fitur seperti ekspansi brace.Tetapi bahkan jika Anda menonaktifkan mode POSIX, gema berperilaku seperti
echo -e
secara default:/ bin / sh adalah dash pada Ubuntu , jadi beberapa bashism bekerja dengan / bin / sh pada OS X tetapi tidak Ubuntu.
Jika Anda benar-benar ingin menulis skrip untuk (sesuatu seperti) shell Bourne asli, Anda bisa menggunakannya
#!/usr/bin/env bash +B
.Saya pikir lebih mudah menulis skrip untuk bash daripada menghindari fitur yang bukan bagian dari spesifikasi POSIX atau cangkang Bourne atau menguji semuanya dengan cangkang lain.
sumber
Sebenarnya, meskipun / bin / sh dapat berupa tautan ke / bin / bash, jika dijalankan karena ia berperilaku berbeda. Dari halaman bash:
Jadi
sh
, ia mencoba untuk meniru perilaku sejarah. Sepertibash
, ia mencoba untuk menjadi berguna sebagai shell login interaktif.sumber
Pada banyak sistem dan pada Solaris pada khususnya, bash terhubung secara dinamis sementara sh terhubung secara statis. Ini dapat menimbulkan ancaman keamanan, karena alasan ini pengguna root hanya boleh menggunakan / bin / sh sebagai shell (jika Anda perlu login sebagai root).
sumber
ldconfig
atau/lib
direktori Anda dihapus karena suatu alasan.