Saat menulis program shell, kita sering menggunakan /bin/sh
dan /bin/bash
. Saya biasanya menggunakan bash
, tetapi saya tidak tahu apa perbedaan di antara mereka.
Apa perbedaan utama antara bash
dan sh
?
Apa yang perlu kita waspadai saat pemrograman masuk bash
dan sh
?
Jawaban:
Apa itu sh
sh
(atau Bahasa Perintah Shell) adalah bahasa pemrograman yang dijelaskan oleh standar POSIX . Ini memiliki banyak implementasi (ksh88
,dash
, ...).bash
juga dapat dianggap sebagai implementasish
(lihat di bawah).Karena
sh
ini adalah spesifikasi, bukan implementasi,/bin/sh
adalah symlink (atau hard link) untuk implementasi aktual pada sebagian besar sistem POSIX.Apa itu bash
bash
dimulai sebagaish
implementasi -compatible (meskipun mendahului standar POSIX beberapa tahun), tetapi seiring berjalannya waktu ia telah memperoleh banyak ekstensi. Banyak dari ekstensi ini dapat mengubah perilaku skrip POSIX shell yang valid, jadi dengan sendirinyabash
bukan shell POSIX yang valid. Sebaliknya, ini adalah dialek bahasa shell POSIX.bash
mendukung a--posix
switch, yang membuatnya lebih kompatibel dengan POSIX. Itu juga mencoba untuk meniru POSIX jika dipanggil sebagaish
.sh = bash?
Untuk waktu yang lama,
/bin/sh
digunakan untuk menunjuk/bin/bash
pada sebagian besar sistem GNU / Linux. Akibatnya, hampir menjadi aman untuk mengabaikan perbedaan antara keduanya. Tapi itu mulai berubah baru-baru ini.Beberapa contoh populer sistem di mana
/bin/sh
tidak menunjuk/bin/bash
(dan beberapa di antaranya/bin/bash
bahkan mungkin tidak ada) adalah:sh
kedash
secara default;initramfs
. Ini menggunakanash
implementasi shell.pdksh
, turunan dari shell Korn. FreeBSDsh
adalah turunan dari shell UNIX Bourne yang asli. Solaris memiliki sendirish
yang untuk waktu yang lama tidak sesuai dengan POSIX; implementasi gratis tersedia dari proyek Heirloom .Bagaimana Anda bisa mengetahui
/bin/sh
poin apa yang ada di sistem Anda?Komplikasinya adalah yang
/bin/sh
bisa berupa tautan simbolik atau tautan keras. Jika tautan simbolis, cara portabel untuk mengatasinya adalah:Jika ini tautan keras, coba
Faktanya,
-L
flag tersebut mencakup symlink dan hardlink, tetapi kelemahan dari metode ini adalah tidak portabel - POSIX tidak perlufind
mendukung-samefile
opsi, meskipun GNU menemukan dan FreeBSD menemukan mendukungnya.Garis Shebang
Pada akhirnya, terserah Anda untuk memutuskan mana yang akan digunakan, dengan menulis baris «shebang» sebagai baris pertama dari skrip.
Misalnya
akan menggunakan
sh
(dan apa pun yang terjadi menunjuk ke),akan digunakan
/bin/bash
jika tersedia (dan gagal dengan pesan kesalahan jika tidak). Tentu saja, Anda juga dapat menentukan implementasi lain, misYang mana yang akan digunakan
Untuk skrip saya sendiri, saya lebih suka
sh
karena alasan berikut:bash
, mereka diharuskan memilikinyash
Ada keuntungan menggunakan
bash
juga. Fitur-fiturnya membuat pemrograman lebih mudah dan mirip dengan pemrograman dalam bahasa pemrograman modern lainnya. Ini termasuk hal-hal seperti scoping variabel lokal dan array. Plainsh
adalah bahasa pemrograman yang sangat minimalis.sumber
bash
tampilan cara pesan kesalahan lebih berguna dalam kasus kesalahan sintaks. Anda cukup menghemat waktu dengan menggunakan bash.%
artinya di awal baris perintah Anda?$
sebagai ganti%
, atau#
untuk shell root.$
dan#
...sh
ada sebelum bash (yang merupakan singkatan dari bourne-again shell). Tapi itu sangat primitif dan tidak menanggapi peristiwa terminal, sepertiESC
karakter. Kemudianksh
datang (juga sebelum bash), kemudian bash dimulai oleh mereka yang menyukai ide shell yang lebih baik, tetapi membenci ksh. :-)sh
: http://man.cx/shbash
: http://man.cx/bashTL; DR :
bash
adalah superset darish
dengan sintaks yang lebih elegan dan fungsionalitas yang lebih banyak. Aman untuk menggunakan garis bash shebang di hampir semua kasus karena cukup ada di platform modern.NB: di beberapa lingkungan,
sh
adalahbash
. Periksash --version
.sumber
Pertanyaan ini sering dinominasikan sebagai kanonik bagi orang-orang yang mencoba untuk menggunakan
sh
dan terkejut bahwa itu tidak berperilaku sama denganbash
. Berikut ini ikhtisar singkat kesalahpahaman dan perangkap umum.Pertama, Anda harus memahami apa yang diharapkan.
sh scriptname
, atau menjalankannya denganscriptname
dan ada#!/bin/sh
di baris shebang , Anda harus mengharapkansh
perilaku POSIX .bash scriptname
, atau menjalankannya denganscriptname
dan memiliki#!/bin/bash
(atau setara lokal) di baris shebang, Anda harus mengharapkan perilaku Bash.Memiliki shebang yang benar dan menjalankan skrip dengan mengetikkan hanya nama skrip (mungkin dengan path relatif atau penuh ) umumnya merupakan solusi yang disukai. Selain shebang yang benar, ini membutuhkan file skrip untuk memiliki izin eksekusi (
chmod a+x scriptname
).Jadi, bagaimana mereka sebenarnya berbeda?
Manual Referensi Bash memiliki bagian yang mencoba untuk menghitung perbedaan tetapi beberapa sumber kebingungan umum termasuk
[[
tidak tersedia dish
(hanya[
yang lebih kikuk dan terbatas).sh
tidak memiliki array.local
,source
,function
,shopt
,let
,declare
, danselect
tidak portabel untuksh
. (Beberapash
implementasi mendukung mislocal
.)for((i=0;i<=3;i++))
loop tiga argumen ,+=
penambahan tugas, dll.$'string\nwith\tC\aescapes'
Fitur ini sementara diterima untuk POSIX (artinya berfungsi di Bash sekarang, tetapi belum akan didukung olehsh
pada sistem yang hanya mematuhi arus) Spesifikasi POSIX, dan kemungkinan tidak akan untuk beberapa waktu mendatang).<<<'here strings'
.*.{png,jpg}
dan{0..12}
memperkuat ekspansi.Ini ada di POSIX, tetapi mungkin hilang dari beberapa~
merujuk$HOME
hanya di Bash (dan lebih umum~username
ke direktori home ofusername
)./bin/sh
implementasi pra-POSIX .<(cmd)
dan>(cmd)
.&|
untuk2>&1 |
dan&>
untuk> ... 2>&1
<>
pengalihan.${substring:1:2}
,${variable/pattern/replacement}
, konversi kasus, dll$[expression]
sintaks legacy usang yang bagaimanapun harus diganti dengan$((expression))
sintaks aritmatika POSIX . (Beberapa warisan pra-POSIXsh
Meskipun demikian, beberapa implementasi mungkin tidak mendukungnya.)$RANDOM
,$SECONDS
,$PIPESTATUS[@]
dan$FUNCNAME
adalah Bash ekstensi.export variable=value
dan[ "x" == "y" ]
yang tidak portabel (export variable
harus terpisah dari penugasan variabel, dan perbandingan string portabel dalam[ ... ]
menggunakan tanda sama dengan tunggal).Ingat, ini adalah daftar singkat. Lihat manual referensi untuk sendok penuh, dan http://mywiki.wooledge.org/Bashism untuk banyak solusi yang baik; dan / atau coba http://shellcheck.net/ yang memperingatkan banyak fitur Bash-only.
Kesalahan umum adalah memiliki
#!/bin/bash
garis shebang, tetapi kemudian menggunakansh scriptname
untuk benar-benar menjalankan skrip. Ini pada dasarnya menonaktifkan fungsionalitas Bash-only, sehingga Anda mendapatkan kesalahan sintaks misalnya untuk mencoba menggunakan array. (Baris shebang secara sintaksis adalah komentar, jadi itu hanya diabaikan dalam skenario ini.)Sayangnya, Bash tidak akan memperingatkan ketika Anda mencoba menggunakan konstruksi ini ketika dipanggil sebagai
sh
. Itu tidak sepenuhnya menonaktifkan semua fungsi Bash-only, jadi, jalankan Bash dengan menjalankannya sebagaish
bukan cara yang baik untuk memeriksa apakah skrip Anda portabel untukash
/dash
/ POSIXsh
atau varian seperti Heirloomsh
sumber
export variable=value
diamanatkan oleh POSIX: pubs.opengroup.org/onlinepubs/009695399/utilities/export.html . Mungkin itu tidak tersedia di beberapa kerang kuno, tetapi jelas bukan bashism.Shell adalah antarmuka antara pengguna dan OS untuk mengakses layanan sistem operasi. Ini bisa berupa GUI atau CLI (antarmuka Baris Perintah).
sh (Bourne sh ell) adalah juru bahasa command-line shell, untuk sistem operasi mirip Unix / Unix. Ini menyediakan beberapa perintah bawaan. Dalam bahasa scripting kami menunjukkan interpreter sebagai
#!/bin/sh
. Itu adalah salah satu yang paling banyak didukung oleh cangkang lain seperti bash (gratis / terbuka), kash (tidak gratis).Bash ( B ourne a gain s hell) adalah pengganti shell untuk shell Bourne. Bash adalah superset dari sh. Bash mendukung sh. POSIX adalah seperangkat standar yang mendefinisikan bagaimana sistem yang sesuai dengan POSIX harus bekerja. Bash sebenarnya bukan shell yang sesuai dengan POSIX. Dalam bahasa scripting kami menunjukkan interpreter sebagai
#!/bin/bash
.Analogi:
sumber
sh
(jadi itu adalah "subclass" dalam arti OOP) dan memperluasnya (jadi memiliki superset fungsi).Posting dari UNIX.COM
Fitur shell
Tabel di bawah ini mencantumkan sebagian besar fitur yang saya pikir akan membuat Anda memilih satu shell di atas yang lain. Ini tidak dimaksudkan untuk menjadi daftar yang pasti dan tidak termasuk setiap fitur yang mungkin untuk setiap shell yang mungkin. Suatu fitur hanya dianggap sebagai suatu shell jika dalam versi yang datang dengan sistem operasi, atau jika itu tersedia sebagai dikompilasi langsung dari distribusi standar. Khususnya shell C yang ditentukan di bawah ini adalah yang tersedia di SUNOS 4. *, sejumlah besar vendor sekarang mengirimkan tcsh atau shell C yang disempurnakan sebagai gantinya (mereka tidak selalu menjelaskan bahwa mereka mengirim tcsh.
Kode:
Kunci ke tabel di atas.
Fitur Y dapat dilakukan dengan menggunakan shell ini.
Fitur N tidak ada di shell.
Fitur F hanya dapat dilakukan dengan menggunakan mekanisme fungsi kerang.
L Perpustakaan readline harus ditautkan ke shell untuk mengaktifkan Fitur ini.
Catatan untuk tabel di atas
sumber
TERMINAL
KULIT
SH Vs. PESTA
SH
PESTA
MATERI REFERENSI:
SHELL gnu.org:
BASH gnu.org:
sumber
Jawaban lain umumnya menunjukkan perbedaan antara Bash dan standar shell POSIX. Namun, ketika menulis skrip shell portabel dan digunakan untuk sintaks Bash, daftar bashisme khas dan solusi POSIX murni yang sesuai sangat berguna. Daftar tersebut telah dikompilasi ketika Ubuntu beralih dari Bash ke Dash sebagai shell sistem default dan dapat ditemukan di sini: https://wiki.ubuntu.com/DashAsBinSh
Selain itu, ada alat hebat yang disebut checkbashisms yang memeriksa bashisms di skrip Anda dan berguna ketika Anda ingin memastikan bahwa skrip Anda portabel.
sumber
Mereka hampir identik tetapi
bash
memiliki lebih banyak fitur -sh
adalah (kurang lebih) bagian yang lebih tua daribash
.sh
sering berarti yang asliBourne shell
, yang mendahuluibash
(Bourne *again* shell
), dan diciptakan pada tahun 1977. Namun, dalam praktiknya, mungkin lebih baik untuk menganggapnya sebagai shell yang sangat kompatibel dengan standar POSIX dari tahun 1992.Skrip yang dimulai dengan
#!/bin/sh
atau menggunakansh
shell biasanya melakukannya untuk kompatibilitas mundur. OS unix / linux apa pun akan memilikish
shell. Di Ubuntush
sering memanggildash
dan pada MacOS itu adalah versi POSIX khususbash
. Kerang ini mungkin lebih disukai untuk perilaku yang sesuai standar, kecepatan atau kompatibilitas ke belakang.bash
lebih baru dari aslinyash
, menambahkan lebih banyak fitur, dan berusaha untuk kompatibel dengansh
. Secara teori,sh
program harus dijalankanbash
.bash
tersedia di hampir semua mesin linux / unix dan biasanya digunakan secara default - dengan pengecualian MacOS default kezsh
Catalina (10.15). FreeBSD, secara default, tidak datang denganbash
diinstal.sumber
sh
jauh sebelum POSIX. Hari ini, Anda akan berharap bahwa apa pun yangsh
Anda temukan setidaknya kompatibel dengan POSIX; tetapi pada sistem warisan ini tidak berarti diberikan. POSIX stadardizes jauh lebih banyak daripada shell; pada kenyataannya, Anda bisa berpendapat bahwa standardisasi panggilan sistem operasi dan fungsi pustaka lebih penting./bin/sh
mungkin atau mungkin tidak menjalankan program yang sama dengan/bin/bash
.sh
mendukung setidaknya fitur yang diperlukan oleh POSIX (dengan asumsi implementasi yang benar). Itu mungkin mendukung ekstensi juga.bash
, "Bourne Again Shell", mengimplementasikan fitur-fitur yang diperlukan untuk ekstensi khusus sh plus bash. Set lengkap ekstensi terlalu panjang untuk dijelaskan di sini, dan bervariasi dengan rilis baru. Perbedaannya didokumentasikan dalam manual bash. Ketikinfo bash
dan baca bagian "Fitur Bash" (bagian 6 dalam versi saat ini), atau baca dokumentasi saat ini secara online .sumber
sh
hanya memberi Anda shell POSIX, jika Anda memiliki hak yangPATH
diatur di shell Anda saat ini. Tidak ada nama PATH yang ditentukan yang memberi Anda shell POSIX.sh
tidak perlu memberi Anda shell POSIX, pada Solaris, misalnya.bash dan sh adalah dua cangkang yang berbeda. Pada dasarnya bash adalah sh, dengan lebih banyak fitur dan sintaksis yang lebih baik. Sebagian besar perintah bekerja sama, tetapi mereka berbeda. Bash adalah singkatan dari "Bourne Again SHell", dan merupakan pengganti / peningkatan dari shell Bourne asli (sh).
Skrip shell adalah skrip dalam shell apa pun, sedangkan skrip Bash adalah skrip khusus untuk Bash. Namun dalam praktiknya, "skrip shell" dan "skrip bash" sering digunakan secara bergantian, kecuali shell yang dimaksud bukan Bash.
Karena itu, Anda harus menyadari / bin / sh pada sebagian besar sistem akan menjadi tautan simbolis dan tidak akan memanggil sh. Di Ubuntu / bin / sh digunakan untuk menautkan ke bash, perilaku khas pada distribusi Linux, tetapi sekarang telah berubah untuk menautkan ke shell lain yang disebut dash. Saya akan menggunakan bash, karena itu cukup standar (atau paling tidak paling umum, dari pengalaman saya). Faktanya, masalah timbul ketika skrip bash akan menggunakan #! / Bin / sh karena pembuat skrip mengasumsikan bahwa tautan tersebut adalah untuk bash ketika tidak harus.
sumber
Perbedaannya semudah mungkin: Setelah memiliki pemahaman dasar, komentar lain yang diposting di atas akan lebih mudah ditangkap.
Shell - "Shell" adalah program yang memfasilitasi interaksi antara pengguna dan sistem operasi (kernel). Ada banyak implementasi shell yang tersedia, seperti sh, bash, csh, zsh ... dll.
Menggunakan salah satu program Shell, kita akan dapat menjalankan perintah yang didukung oleh program shell itu.
Bash - Ini berasal dari B ourne- sebuah keuntungan Sh elo. Dengan menggunakan program ini, kita akan dapat menjalankan semua perintah yang ditentukan oleh Shell. Kami juga dapat menjalankan beberapa perintah yang secara khusus ditambahkan ke program ini. Bash memiliki kompatibilitas mundur dengan sh.
Sh - Ini berasal dari Bourne Sh ell. "sh" mendukung semua perintah yang ditentukan dalam shell. Berarti, Menggunakan program ini, kita akan dapat menjalankan semua perintah yang ditentukan oleh Shell.
Untuk informasi lebih lanjut, lakukan: - https://man.cx/sh - https://man.cx/bash
sumber
Sistem operasi Linux menawarkan berbagai jenis shell. Meskipun shell memiliki banyak perintah yang sama, masing-masing jenis memiliki fitur unik. Mari kita pelajari berbagai jenis cangkang yang kebanyakan digunakan.
Shell sh:
Shell Sh juga dikenal sebagai Bourne Shell. Shell Sh adalah shell pertama yang dikembangkan untuk komputer Unix oleh Stephen Bourne di AT&T Bell Labs pada tahun 1977. Ini termasuk banyak alat 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 menjalankan sebagian besar skrip shell Sh tanpa modifikasi dan menyediakan fitur pengeditan baris perintah juga.
sumber