Perbedaan antara sh dan bash
Ketika menulis program shell, kita sering menggunakan /bin/sh
dan /bin/bash
. Saya biasanya menggunakan bash
, tapi aku don't tahu apa yang's perbedaan antara mereka.
Apa's perbedaan utama antara bash
dan sh
?
Apa yang kita perlu menyadari ketika pemrograman di bash
dan sh
?
1182
11
Apa sh
sh
(atau Shell Command Language) merupakan sebuah bahasa pemrograman yang dijelaskan oleh POSIX standar. Ini memiliki banyak implementasi (ksh88
,dash
, ...).bash
juga dapat dianggap sebagai implementasi darish
(lihat di bawah).Karena
sh
adalah keterangan, bukan penerapan,/bin/sh
adalah sebuah symlink (atau hard link) untuk implementasi aktual pada kebanyakan sistem POSIX.Apa bash
bash
dimulai sebagai sebuahsh
-yang kompatibel pelaksanaan (meskipun itu mendahului standar POSIX dengan beberapa tahun), tetapi seiring waktu berlalu ia telah memperoleh banyak ekstensi. Banyak dari ekstensi ini dapat mengubah perilaku valid POSIX shell script, sehingga dengan sendirinyabash
adalah tidak sah POSIX shell. Sebaliknya, itu adalah dialek dari POSIX shell bahasa.bash
mendukung--posix
switch, yang membuatnya lebih POSIX-compliant. Hal ini juga mencoba untuk meniru POSIX jika dipanggil sebagaish
.sh = bash?
Untuk waktu yang lama,
/bin/sh
digunakan untuk menunjuk ke/bin/bash
pada kebanyakan sistem GNU/Linux. Akibatnya, hal itu telah hampir menjadi aman untuk mengabaikan perbedaan antara keduanya. Tapi yang mulai berubah baru-baru ini.Beberapa contoh populer dari sistem di mana
/bin/sh
tidak menunjuk ke/bin/bash
(dan beberapa di antaranya/bin/bash
bahkan mungkin tidak ada) adalah:sh
untuklari
secara default;initramfs
. Ia menggunakanabu
shell implementasi.pdksh
, keturunan dari Korn shell. FreeBSD'ssh
adalah keturunan dari UNIX asli Bourne shell. Solaris memiliki sendirish
yang untuk waktu yang lama tidak POSIX-compliant; implementasi bebas tersedia dari Pusaka proyek.Bagaimana anda bisa mengetahui apa
/bin/sh
poin untuk sistem anda?Komplikasi adalah bahwa
/bin/sh
bisa menjadi sebuah link simbolik atau hard link. Jika itu's simbolik link, portable cara untuk mengatasinya adalah:Jika itu's a hard link, coba
Dalam kenyataannya,
- L
bendera mencakup baik symlink dan hardlinks, namun kelemahan dari metode ini adalah bahwa hal itu tidak portabel — POSIX tidak memerlukanmenemukan
mendukung-samefile
pilihan, meskipun kedua GNU menemukan dan FreeBSD menemukan dukungan itu.Shebang baris
Pada akhirnya, itu's terserah anda untuk memutuskan mana yang akan digunakan, dengan menulis «peristiwa» line.
E. g.
akan menggunakan
sh
(dan apa pun yang terjadi pada titik ke titik),akan menggunakan
/bin/bash
jika's yang tersedia (dan gagal dengan pesan kesalahan jika itu's tidak). Tentu saja, anda juga dapat menentukan implementasi lain, misalnyaMana yang akan digunakan
Untuk saya sendiri script, saya lebih memilih
sh
untuk alasan berikut:bash
, mereka dituntut untuk memilikish
Ada keuntungan untuk menggunakan
bash
juga. Fitur yang membuat pemrograman lebih mudah dan mirip dengan pemrograman dalam bahasa pemrograman modern lainnya. Ini termasuk hal-hal seperti cakupan lokal variabel dan array. Polossh
adalah sangat minimalis bahasa pemrograman.sh
: http://man.cx/shbash
: http://man.cx/bashTL;DR:
bash
adalah superset darish
dengan lebih elegan sintaks dan fungsi yang lebih. Hal ini aman untuk digunakan bash shebang baris di hampir semua kasus seperti itu's cukup di mana-mana pada platform modern.NB: dalam beberapa lingkungan,
sh
adalahbash
. Periksash --version
.Pertanyaan ini telah sering dinominasikan sebagai kanonik bagi orang-orang yang mencoba untuk menggunakan
sh
dan terkejut bahwa itu's tidak berperilaku sama sepertibash
. Berikut ini's cepat ikhtisar dari kesalahpahaman umum dan perangkap.Pertama, anda harus memahami apa yang diharapkan.
sh scriptname
, atau menjalankannya denganscriptname
dan memiliki#!/bin/sh
di peristiwa line, anda harus mengharapkan POSIXsh
perilaku.bash scriptname
, atau menjalankannya denganscriptname
dan memiliki#!/bin/bash
(atau setara) dalam peristiwa line, anda harus mengharapkan Bash perilaku.Setelah benar-benar shebang dan menjalankan script hanya dengan mengetikkan nama script (mungkin dengan relatif atau full path) umumnya solusi yang lebih disukai. Selain memperbaiki shebang, ini membutuhkan file script untuk mengeksekusi izin (
chmod+x scriptname
).Jadi, bagaimana mereka benar-benar berbeda?
Bash Referensi manual memiliki bagian yang mencoba untuk menghitung differences tapi beberapa sumber umum dari kebingungan mencakup
[[
tidak tersedia dish
(hanya[
yang lebih kikuk dan terbatas).sh
tidak memiliki array.lokal
,sumber
,fungsi
,shopt
,membiarkan
,menyatakan
, danpilih
tidak portabel untuksh
. (Beberapash
implementasi dukungan misallokal
.)untuk((i=0;i<=3;i++))
loop,+=
kenaikan tugas, dll. The$'string\nwith\tC\aescapes'
fitur tentatif diterima untuk POSIX (yang berarti bekerja di Bash sekarang, tetapi belum didukung olehsh
pada sistem yang hanya mengikuti arus POSIX spesifikasi, dan kemungkinan besar tidak akan untuk beberapa waktu yang akan datang).<<<'di sini string'
.*.{png,jpg}
dan{0..12}
brace ekspansi.Ini adalah di POSIX, tapi mungkin hilang dari beberapa pra-POSIX~
mengacu pada$HOME
hanya di Bash (dan lebih umumnya~username
ke direktori home dariusername
)./bin/sh
implementasi.<(cmd)
dan>(cmd)
.&|
untuk2>&1 |
dan&>
untuk> ... 2>&1
<>
pengalihan.${substring:1:2}
,${variabel/pola/replacement}
, kasus konversi, dll.$[ekspresi]
sintaks yang namun harus diganti dengan POSIX aritmatika$((ekspresi))
sintaks. (Beberapa warisan pra-POSIXsh
implementasi mungkin tidak mendukung itu, meskipun.)$ACAK
,$DETIK
,$PIPESTATUS[@]
dan$FUNCNAME
adalah Bash ekstensi.ekspor variabel=nilai
dan[ "x" == "y" ]
yang tidak portabel (ekspor variabel
harus terpisah dari variabel tugas, dan portabel perbandingan string di[ ... ]
menggunakan satu tanda sama dengan).Ingat, ini adalah sebuah ringkasan daftar. Lihat manual referensi untuk sendok penuh, dan http://mywiki.wooledge.org/Bashism selama bertahun-baik workarounds; dan/atau mencoba http://shellcheck.net/ yang memperingatkan selama bertahun-Bash-satunya fitur.
Sebuah kesalahan umum adalah untuk memiliki
#!/bin/bash
shebang line, tapi kemudian tetap menggunakansh scriptname
untuk benar-benar menjalankan script. Ini pada dasarnya menonaktifkan setiap Bash-satunya fungsi, sehingga anda mendapatkan kesalahan sintaks misalnya untuk mencoba untuk menggunakan array. (Yang shebang baris sintaksis komentar, jadi itu hanya diabaikan dalam skenario ini.)Sayangnya, Bash tidak akan memperingatkan anda ketika anda mencoba untuk menggunakan konstruksi ini ketika itu dipanggil sebagai
sh
. Itu doesn't benar-benar menonaktifkan semua Bash-satunya fungsi, baik, agar menjalankan Bash dengan menerapkan it sebagaish
adalah bukan cara yang baik untuk memeriksa apakah naskah anda benar portabel untukash
/dash
/POSIXsh
atau varian seperti Pusakash
Posting dari UNIX.COM
*Shellfitur
Tabel ini mencantumkan berbagai fitur yang saya pikir akan membuat anda memilih salah satu shell atas yang lain. Hal ini tidak dimaksudkan untuk menjadi daftar definitif dan tidak termasuk setiap fitur yang mungkin untuk setiap kemungkinan shell. Fitur ini hanya dianggap berada dalam shell jika dalam versi yang datang dengan sistem operasi, atau jika sudah tersedia seperti yang dikumpulkan langsung dari distribusi standar. Khususnya C shell yang ditentukan di bawah ini yang tersedia pada SUNOS 4.*, sejumlah besar vendor sekarang kapal baik tcsh atau mereka sendiri yang disempurnakan C shell bukan (mereka don't selalu membuatnya jelas bahwa mereka adalah pengiriman tcsh.
Kode:
Key untuk tabel di atas.
Y Fitur dapat dilakukan dengan menggunakan shell ini.
N Fitur ini tidak hadir dalam shell.
Fitur F hanya dapat dilakukan dengan menggunakan fungsi kerang mekanisme.
L readline perpustakaan harus dihubungkan ke shell untuk mengaktifkan Fitur ini.
Catatan untuk tabel di atas
Shell adalah sebuah antarmuka antara pengguna dan OS untuk akses ke sebuah sistem operasi yang's layanan. Hal ini dapat berupa GUI atau CLI (Command Line interface).
sh (Bourne shell) adalah sebuah shell command-line interpreter, untuk Unix/Unix-seperti sistem operasi. Ini menyediakan beberapa built-in perintah. Dalam bahasa scripting kami menunjukkan interpreter sebagai
#!/bin/sh
. Itu adalah salah satu yang paling banyak didukung oleh kerang lainnya seperti bash (free/open), kash (tidak gratis).Bash (Bourne akeuntungan sneraka) adalah pengganti shell untuk Bourne shell. Bash adalah superset dari sh. Bash mendukung sh. POSIX adalah satu set standar yang mendefinisikan bagaimana POSIX-compliant sistem harus bekerja. Bash adalah tidak benar-benar POSIX-compliant shell. Dalam sebuah bahasa scripting kami menunjukkan interpreter sebagai
#!/bin/bash
.Analogi:
TERMINAL
SHELL
SH Vs. BASH
SH
BASH
BAHAN REFERENSI:
SHELL gnu.org:
BASH gnu.org:
Jawaban yang lain umumnya menunjukkan perbedaan antara Bash dan POSIX shell standar. Namun, ketika menulis portable script shell dan digunakan untuk Bash sintaks, daftar khas bashisms dan murni sesuai POSIX solusi ini sangat berguna. Seperti daftar yang telah disusun ketika Ubuntu beralih dari Bash untuk Dash sebagai default shell sistem dan dapat ditemukan di sini: https://wiki.ubuntu.com/DashAsBinSh
Selain itu, ada alat yang disebut checkbashisms yang memeriksa bashisms di script anda dan datang berguna ketika anda ingin memastikan bahwa naskah anda adalah portabel.
/bin/sh
mungkin atau tidak mungkin memanggil program yang sama seperti/bin/bash
.sh
mendukung setidaknya fitur yang dibutuhkan oleh POSIX (dengan asumsi pelaksanaan yang benar). Hal ini dapat mendukung ekstensi juga.bash
, "Bourne Again Shell", mengimplementasikan fitur yang diperlukan untuk sh plus bash-ekstensi tertentu. Set lengkap ekstensi terlalu panjang untuk menjelaskan di sini, dan itu bervariasi dengan rilis baru. Perbedaan yang didokumentasikan dalam bash manual. Jenisinfo bash
dan baca "Bash Fitur" bagian (bagian 6 dalam versi saat ini), atau membaca saat ini dokumentasi online.bash dan sh adalah dua kerang yang berbeda. Pada dasarnya bash sh, dengan lebih banyak fitur dan lebih baik sintaks. Sebagian besar perintah kerja yang sama, tapi mereka berbeda.Bash (bash) adalah salah satu dari banyak tersedia (namun yang paling umum digunakan) Unix kerang. Bash merupakan singkatan dari "Bourne Again SHell",dan penggantian/perbaikan asli Bourne shell (sh).
Shell scripting merupakan script di setiap shell, sedangkan Bash scripting merupakan script khusus untuk Bash. Dalam prakteknya, bagaimanapun, "shell script" dan "bash script" sering digunakan secara bergantian, kecuali shell dalam pertanyaan tidak Bash.
Setelah mengatakan itu, anda harus menyadari /bin/sh pada kebanyakan sistem akan menjadi sebuah link simbolik dan tidak akan memanggil sh. Di Ubuntu /bin/sh digunakan untuk link ke pesta, perilaku khas pada distribusi Linux, tapi sekarang telah berubah untuk menghubungkan ke shell lain yang disebut dash. Saya akan menggunakan bash, karena itu cukup banyak standar (atau setidaknya yang paling umum, dari pengalaman saya). Pada kenyataannya, masalah timbul ketika sebuah bash script yang akan digunakan #!/bin/sh karena script-pembuat mengasumsikan link ini untuk bash ketika itu doesn't harus.
sh
adalah (lebih atau kurang) sebuah subset daribash
.sh
berasal dari POSIX (Portable Operating System Interface) yang bertujuan untuk menyatukan unix/linux lebih dari satu bahasa yang sama dll. Yang umum, portable, bahasa adalahsh
, dan's kedua distandarisasi oleh IEEE dan tersedia pada setiap linux/unix (alias "POSIX compatible") mesin.bash
yang sedikit lebih baru darish
, dan berusaha untuk menjadi POSIX compatible (sehingga's dirancang untuk menjalankansh
script) dan tersedia di hampir semua linux/unix mesin dan biasanya digunakan secara default.Sistem operasi Linux yang menawarkan berbagai jenis shell. Meskipun kerang memiliki banyak perintah yang sama, masing-masing jenis memiliki fitur unik. Mari kita belajar berbeda dari sebagian besar digunakan kerang.
Sh shell:
Sh shell juga dikenal sebagai Bourne Shell. Sh shell adalah shell pertama yang dikembangkan untuk Unix komputer oleh Stephen Bourne dari AT&T's Bell Labs pada tahun 1977. Ini mencakup banyak scripting.
Bash shell :
Bash shell adalah singkatan dari Bourne Again Shell. Bash shell adalah shell default di sebagian besar distribusi linux dan pengganti Sh Shell (Sh shell juga akan berjalan di Bash shell) . Bash Shell dapat melaksanakan sebagian besar Sh shell script tanpa modifikasi dan memberikan perintah line fitur editing juga.