Apa perbedaan antara bash dan sh?

28

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 shitu lebih tua dari bash, dan bahwa tidak ada perbedaan nyata.

Apakah ada yang tahu perbedaannya? Bisakah Anda memberi saya contoh praktis kapan harus menggunakannya?

Saif Bechan
sumber
untuk gambaran umum tentang shell yang berbeda (bukan hanya shdan bash): http://en.wikipedia.org/wiki/Comparison_of_command_shells
akira
1
Sejarah hebat lainnya di sini: faqs.org/faqs/unix-faq/shell/shell-differences
John Wright

Jawaban:

34

bashadalah superset shyaitu. segala sesuatu yang dapat Anda lakukan di shdapat Anda lakukan di bash.

Bash memiliki lebih banyak fitur (percabangan, builtin, array) yang membuat skrip lebih mudah untuk ditulis. Beberapa nanti * nix'es memiliki /bin/shtautan ke/bin/bash

Untuk penjelasan lengkap tentang apa ini tutorial

Nifle
sumber
5
@ Saif Bechan: Salah satu alasan mengapa shell Bourne ( 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_shell
Felix
7
Menghapus shakan 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.
tgl
3
... dan yang lebih menyenangkan lagi, Ubuntu symlinks / bin / sh to dash. Dash tidak sepenuhnya kompatibel dengan sh atau bash, tetapi seharusnya mulai lebih cepat. Ketika sistem boot, semua skrip init.d berjalan dan saya kira waktu yang disimpan secara keseluruhan sepadan.
kbyrd
8
Saya cukup yakin Dash sepenuhnya memenuhi persyaratan. Masalahnya adalah bahwa beberapa orang menulis skrip yang mengatakan / bin / sh, tetapi skrip itu sendiri membutuhkan / bin / bash untuk bekerja. Tidak ada yang melihat masalah, karena sebagian besar waktu, / bin / sh hanya menunjuk pada / bin / bash.
davr
8
@ Saif: Ada alasan lain mengapa shtidak diperpanjang: kode sumbernya adalah neraka murni. Lihatlah. Ini seharusnya menjadi C ...
grawity
6

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 shperintah 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, shperintahnya hampir selalu hanya berupa tautan bash, dengan semua fitur yang sama.

njd
sumber
2
Bash seharusnya (tetapi tidak selalu) berperilaku dalam mode kompatibilitas-sh jika dipanggil sebagai / bin / sh. Banyak hal yang rusak ketika Ubuntu beralih / bin / sh dari menghubungkan ke / bin / bash ke menghubungkan ke / bin / dash. Barang-barang yang rusak diasumsikan bashism ketika mereka seharusnya menggunakan sh standar.
Broam
4

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 bashmemiliki 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:

$ ls -li /bin/{ba,}sh
29631757 -r-xr-xr-x  1 root  wheel  1333920 Jul 26 01:52 /bin/bash
29631758 -r-xr-xr-x  1 root  wheel  1334000 Jul 26 01:52 /bin/sh

man bash :

Jika bash dipanggil dengan nama sh, ia mencoba untuk meniru perilaku startup dari versi historis sh sedekat mungkin, sambil menyesuaikan dengan standar POSIX juga.

Peniruan cangkang Bourne sebaliknya sangat terbatas. bash +B(Bourne) sebenarnya akan menonaktifkan fitur seperti ekspansi brace.

$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}

Tetapi bahkan jika Anda menonaktifkan mode POSIX, gema berperilaku seperti echo -esecara default:

$ sh
$ shopt -uo posix
$ echo '1\b2'
2

/ 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.

Lri
sumber
2

Sebenarnya, meskipun / bin / sh dapat berupa tautan ke / bin / bash, jika dijalankan karena ia berperilaku berbeda. Dari halaman bash:

Jika bash dipanggil dengan nama sh, ia mencoba untuk meniru perilaku startup dari versi historis sh sedekat mungkin, sambil menyesuaikan dengan standar POSIX juga.

Jadi sh, ia mencoba untuk meniru perilaku sejarah. Seperti bash, ia mencoba untuk menjadi berguna sebagai shell login interaktif.

KeithB
sumber
2

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).

Alessandro Vozza
sumber
2
Juga mungkin berguna dalam keadaan darurat jika Anda melakukan sesuatu yang buruk ldconfigatau /libdirektori Anda dihapus karena suatu alasan.
LawrenceC