Perbedaan antara sh dan bash

1305

Saat menulis program shell, kita sering menggunakan /bin/shdan /bin/bash. Saya biasanya menggunakan bash, tetapi saya tidak tahu apa perbedaan di antara mereka.

Apa perbedaan utama antara bashdan sh?

Apa yang perlu kita waspadai saat pemrograman masuk bashdan sh?

Weiwei Yang
sumber
21
Untuk daftar bashisme dan kode terkait yang berfungsi pada shell Bourne, lihat mywiki.wooledge.org/Bashism
StackExchange saddens dancek
1
Anda mungkin ingin melihat standar POSIX untuk sh dan bahasa perintahnya: * sh * Shell Command Language
Maurício C Antunes
7
sebagai aturan umum, semua skrip sh akan berjalan di bawah bash berkat kompatibilitas posixnya, tetapi tidak semua skrip bash dapat berjalan di bawah sh, perbedaan utama yang Anda perhatikan adalah hal-hal seperti [[]] bukan perbandingan [] yang memungkinkan spasi yang tidak dikutip, $ (()) alih-alih $ [] ekspresi aritmatika, dan hal-hal lain seperti "terlalu besar dan terlalu lambat" langsung dari bash docs. Tetapi skrip baru tidak perlu membatasi diri pada skrip yang kompatibel dengan sh, kecuali mereka memotret untuk beberapa kompatibilitas ke belakang, yang lebih sering daripada tidak bukan hari ini, setelah semua itu (atau itu ...) tahun 2014 kan ??
osirisgothra

Jawaban:

1142

Apa itu sh

sh(atau Bahasa Perintah Shell) adalah bahasa pemrograman yang dijelaskan oleh standar POSIX . Ini memiliki banyak implementasi ( ksh88, dash, ...).bashjuga dapat dianggap sebagai implementasi sh(lihat di bawah).

Karena sh ini adalah spesifikasi, bukan implementasi, /bin/shadalah symlink (atau hard link) untuk implementasi aktual pada sebagian besar sistem POSIX.

Apa itu bash

bash dimulai sebagai sh 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 sendirinya bashbukan 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 sebagai sh.

sh = bash?

Untuk waktu yang lama, /bin/shdigunakan 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/shtidak menunjuk /bin/bash(dan beberapa di antaranya /bin/bashbahkan mungkin tidak ada) adalah:

  1. Sistem Debian dan Ubuntu modern, yang terhubung shkedash secara default;
  2. Busybox , yang biasanya dijalankan selama waktu boot sistem Linux sebagai bagian dari initramfs. Ini menggunakanash implementasi shell.
  3. BSD, dan secara umum sistem non-Linux. OpenBSD menggunakan pdksh, turunan dari shell Korn. FreeBSD shadalah turunan dari shell UNIX Bourne yang asli. Solaris memiliki sendiri shyang untuk waktu yang lama tidak sesuai dengan POSIX; implementasi gratis tersedia dari proyek Heirloom .

Bagaimana Anda bisa mengetahui /bin/shpoin apa yang ada di sistem Anda?

Komplikasinya adalah yang /bin/shbisa berupa tautan simbolik atau tautan keras. Jika tautan simbolis, cara portabel untuk mengatasinya adalah:

% file -h /bin/sh
/bin/sh: symbolic link to bash

Jika ini tautan keras, coba

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

Faktanya, -Lflag tersebut mencakup symlink dan hardlink, tetapi kelemahan dari metode ini adalah tidak portabel - POSIX tidak perlu find mendukung -samefileopsi, 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

#!/bin/sh

akan menggunakan sh(dan apa pun yang terjadi menunjuk ke),

#!/bin/bash

akan digunakan /bin/bashjika tersedia (dan gagal dengan pesan kesalahan jika tidak). Tentu saja, Anda juga dapat menentukan implementasi lain, mis

#!/bin/dash

Yang mana yang akan digunakan

Untuk skrip saya sendiri, saya lebih suka shkarena alasan berikut:

  • itu standar
  • itu jauh lebih sederhana dan lebih mudah dipelajari
  • itu portabel di seluruh sistem POSIX - bahkan jika mereka tidak memilikinya bash, mereka diharuskan memilikinyash

Ada keuntungan menggunakan bashjuga. 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. Plain shadalah bahasa pemrograman yang sangat minimalis.

Roman Cheplyaka
sumber
Jika Anda menjalankan skrip dengan bashtampilan cara pesan kesalahan lebih berguna dalam kasus kesalahan sintaks. Anda cukup menghemat waktu dengan menggunakan bash.
PHPst
Apa %artinya di awal baris perintah Anda?
JosephHarriott
@JosephHarriott itu prompt: karakter yang dicetak oleh shell itu sendiri setelah itu perintah Anda mengikuti. Beberapa shell digunakan $sebagai ganti %, atau #untuk shell root.
Roman Cheplyaka
@RomanCheplyaka cangkang mana? Saya hanya pernah melihat $dan #...
JosephHarriott
@RomanCheplyaka Saya yakin shada sebelum bash (yang merupakan singkatan dari bourne-again shell). Tapi itu sangat primitif dan tidak menanggapi peristiwa terminal, seperti ESCkarakter. Kemudian kshdatang (juga sebelum bash), kemudian bash dimulai oleh mereka yang menyukai ide shell yang lebih baik, tetapi membenci ksh. :-)
raminr
145

sh: http://man.cx/sh
bash : http://man.cx/bash

TL; DR : bashadalah 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 adalah bash . Periksa sh --version.

Rein Henrichs
sumber
31
jika bash dipanggil sebagai sh, itu berperilaku sedikit berbeda. Lihat gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files ("Dipanggil dengan nama sh") dan gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode . Misalnya, tidak ada proses substitusi.
glenn jackman
11
Karena bash adalah superset dari sh dan beberapa OS seperti FreeBSD tidak menginstal bash secara default, skrip di sh akan memberikan portabilitas yang lebih besar.
user674062
1
Karena tidak ada cara skrip portabel untuk mendapatkan shell POSIX untuk skrip tertentu, skrip portabel tidak dapat menerima lebih dari fitur Bourne Shell.
schily
83

Pertanyaan ini sering dinominasikan sebagai kanonik bagi orang-orang yang mencoba untuk menggunakan shdan terkejut bahwa itu tidak berperilaku sama dengan bash. Berikut ini ikhtisar singkat kesalahpahaman dan perangkap umum.

Pertama, Anda harus memahami apa yang diharapkan.

  • Jika Anda menjalankan skrip Anda dengan sh scriptname, atau menjalankannya dengan scriptnamedan ada #!/bin/shdi baris shebang , Anda harus mengharapkan shperilaku POSIX .
  • Jika Anda menjalankan skrip Anda dengan bash scriptname, atau menjalankannya dengan scriptnamedan 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 di sh(hanya[ yang lebih kikuk dan terbatas).
  • sh tidak memiliki array.
  • Beberapa kata kunci Bash suka local, source, function, shopt, let, declare, dan selecttidak portabel untuk sh. (Beberapa shimplementasi mendukung mis local.)
  • Bash memiliki banyak ekstensi sintaks gaya C seperti 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 oleh shpada sistem yang hanya mematuhi arus) Spesifikasi POSIX, dan kemungkinan tidak akan untuk beberapa waktu mendatang).
  • Bash mendukung <<<'here strings' .
  • Bash memiliki *.{png,jpg}dan {0..12}memperkuat ekspansi.
  • ~merujuk $HOMEhanya di Bash (dan lebih umum ~usernameke direktori home of username).Ini ada di POSIX, tetapi mungkin hilang dari beberapa /bin/shimplementasi pra-POSIX .
  • Bash memiliki proses substitusi dengan <(cmd)dan >(cmd).
  • Bash memiliki alias pengalihan kenyamanan gaya Csh seperti &|untuk 2>&1 |dan &>untuk> ... 2>&1
  • Bash mendukung proses-proses dengan <>pengalihan.
  • Bash fitur kaya set diperluas ekspansi parameter non-standar seperti ${substring:1:2}, ${variable/pattern/replacement}, konversi kasus, dll
  • Bash telah memperluas fasilitas aritmetika shell secara signifikan (meskipun masih belum ada dukungan floating-point). Ada $[expression]sintaks legacy usang yang bagaimanapun harus diganti dengan $((expression))sintaks aritmatika POSIX . (Beberapa warisan pra-POSIXsh Meskipun demikian, beberapa implementasi mungkin tidak mendukungnya.)
  • Variabel sihir seperti $RANDOM, $SECONDS, $PIPESTATUS[@]dan $FUNCNAMEadalah Bash ekstensi.
  • Perbedaan sintaksis seperti export variable=valuedan [ "x" == "y" ]yang tidak portabel ( export variableharus terpisah dari penugasan variabel, dan perbandingan string portabel dalam [ ... ]menggunakan tanda sama dengan tunggal).
  • Banyak, banyak ekstensi Bash-only untuk mengaktifkan atau menonaktifkan perilaku opsional dan mengekspos keadaan internal shell.
  • Banyak, banyak fitur kenyamanan untuk penggunaan interaktif yang bagaimanapun tidak mempengaruhi perilaku skrip.

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/bashgaris shebang, tetapi kemudian menggunakan sh scriptnameuntuk 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 sebagai shbukan cara yang baik untuk memeriksa apakah skrip Anda portabel untuk ash/ dash/ POSIX shatau varian seperti Heirloomsh

tripleee
sumber
2
Pada dasarnya, TL; DR ersion adalah jawaban And .
tripleee
4
shellcheck.net adalah yang saya butuhkan. terimakasih banyak.
Josh Habdas
FWIW, export variable=valuediamanatkan oleh POSIX: pubs.opengroup.org/onlinepubs/009695399/utilities/export.html . Mungkin itu tidak tersedia di beberapa kerang kuno, tetapi jelas bukan bashism.
Roman Cheplyaka
54

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:

  • Shell seperti antarmuka atau spesifikasi atau API.
  • sh adalah kelas yang mengimplementasikan antarmuka Shell.
  • Bash adalah subclass dari sh.

masukkan deskripsi gambar di sini

Premraj
sumber
3
Saya tidak mengerti. Anda telah menyebutkan "Bash adalah superset dari sh" dan "Bash adalah subclass dari sh", bukankah itu pernyataan yang bertentangan? Bisakah Anda mengklarifikasi?
Keerthana Prabhakaran
11
Saya pikir ini sedang mencoba untuk mengatakan Bash mewarisi dari sh(jadi itu adalah "subclass" dalam arti OOP) dan memperluasnya (jadi memiliki superset fungsi).
tripleee
53

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:

                                     sh   csh  ksh  bash tcsh zsh  rc   es
Job control                          N    Y    Y    Y    Y    Y    N    N
Aliases                              N    Y    Y    Y    Y    Y    N    N
Shell functions                      Y(1) N    Y    Y    N    Y    Y    Y
"Sensible" Input/Output redirection  Y    N    Y    Y    N    Y    Y    Y
Directory stack                      N    Y    Y    Y    Y    Y    F    F
Command history                      N    Y    Y    Y    Y    Y    L    L
Command line editing                 N    N    Y    Y    Y    Y    L    L
Vi Command line editing              N    N    Y    Y    Y(3) Y    L    L
Emacs Command line editing           N    N    Y    Y    Y    Y    L    L
Rebindable Command line editing      N    N    N    Y    Y    Y    L    L
User name look up                    N    Y    Y    Y    Y    Y    L    L
Login/Logout watching                N    N    N    N    Y    Y    F    F
Filename completion                  N    Y(1) Y    Y    Y    Y    L    L
Username completion                  N    Y(2) Y    Y    Y    Y    L    L
Hostname completion                  N    Y(2) Y    Y    Y    Y    L    L
History completion                   N    N    N    Y    Y    Y    L    L
Fully programmable Completion        N    N    N    N    Y    Y    N    N
Mh Mailbox completion                N    N    N    N(4) N(6) N(6) N    N
Co Processes                         N    N    Y    N    N    Y    N    N
Builtin artithmetic evaluation       N    Y    Y    Y    Y    Y    N    N
Can follow symbolic links invisibly  N    N    Y    Y    Y    Y    N    N
Periodic command execution           N    N    N    N    Y    Y    N    N
Custom Prompt (easily)               N    N    Y    Y    Y    Y    Y    Y
Sun Keyboard Hack                    N    N    N    N    N    Y    N    N
Spelling Correction                  N    N    N    N    Y    Y    N    N
Process Substitution                 N    N    N    Y(2) N    Y    Y    Y
Underlying Syntax                    sh   csh  sh   sh   csh  sh   rc   rc
Freely Available                     N    N    N(5) Y    Y    Y    Y    Y
Checks Mailbox                       N    Y    Y    Y    Y    Y    F    F
Tty Sanity Checking                  N    N    N    N    Y    Y    N    N
Can cope with large argument lists   Y    N    Y    Y    Y    Y    Y    Y
Has non-interactive startup file     N    Y    Y(7) Y(7) Y    Y    N    N
Has non-login startup file           N    Y    Y(7) Y    Y    Y    N    N
Can avoid user startup files         N    Y    N    Y    N    Y    Y    Y
Can specify startup file             N    N    Y    Y    N    N    N    N
Low level command redefinition       N    N    N    N    N    N    N    Y
Has anonymous functions              N    N    N    N    N    N    Y    Y
List Variables                       N    Y    Y    N    Y    Y    Y    Y
Full signal trap handling            Y    N    Y    Y    N    Y    Y    Y
File no clobber ability              N    Y    Y    Y    Y    Y    N    F
Local variables                      N    N    Y    Y    N    Y    Y    Y
Lexically scoped variables           N    N    N    N    N    N    N    Y
Exceptions                           N    N    N    N    N    N    N    Y

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

1. This feature was not in the original version, but has since become
   almost standard.
2. This feature is fairly new and so is often not found on many
   versions of the shell, it is gradually making its way into
   standard distribution.
3. The Vi emulation of this shell is thought by many to be
   incomplete.
4. This feature is not standard but unofficial patches exist to
   perform this.
5. A version called 'pdksh' is freely available, but does not have
   the full functionality of the AT&T version.
6. This can be done via the shells programmable completion mechanism.
7. Only by specifying a file via the ENV environment variable.
SriniV
sumber
Meja Anda tidak berguna bagi saya karena mencoba untuk membandingkan fitur-fitur dari Bourne Shell dan fitur-fitur dari ksh dari sebelum 1988. Jika Anda benar-benar membuat tabel untuk 1988, Anda perlu menghapus sebagian besar kerang lain dari tabel itu - termasuk bash , sh dan rc. Bisakah Anda menjelaskan dari mana Anda mendapatkan nilai untuk tabel Anda?
schily
1
Biarkan saya memberikan beberapa petunjuk: Kontrol Pekerjaan telah ditambahkan ke Shell Bourne pada tahun 1989 dan Shell Bourne dibuat OpenSource pada tahun 2005. Shell Korn memiliki proses substitusi sejak setidaknya tahun 1988 dan itu adalah OpenSource sejak tahun 1997. BTW: pernyataan Anda tentang $ ENV tidak benar, $ ENV hanya dibaca / dieksekusi untuk shell interaktif.
schily
3
@schily Kiriman ini telah diambil dari cs.virginia.edu/helpnet/Computer_OS/unix/shells/shelldiff.html
SriniV
@ mungkin Jika Anda merasa itu salah di mana saja, silakan mengeditnya dengan tepat.
SriniV
8
Berdasarkan apa yang diungkapkan oleh schily, tampaknya akan lebih baik untuk menghapus jawaban ini, karena itu pada dasarnya adalah penipuan, dan OP tidak benar-benar memeriksa informasi yang ia tempel.
danno
24

TERMINAL

  • program yang memasang jendela
  • xterm, rxvt, konsole, kvt, gnome-terminal, nxterm, dan eterm.

KULIT

  • Merupakan program yang berjalan di terminal
  • Shell adalah interpreter perintah dan bahasa pemrograman
  • Shell hanyalah prosesor makro yang menjalankan perintah.
  • Prosesor makro berarti fungsionalitas di mana teks dan simbol diperluas untuk membuat ekspresi yang lebih besar.

SH Vs. PESTA

SH

  • (Kulit)
  • Apakah shell tertentu
  • juru bahasa perintah dan bahasa pemrograman
  • Pendahulu BASH

PESTA

  • (Bourne-Again SHell)
  • Apakah shell tertentu
  • juru bahasa perintah dan bahasa pemrograman
  • Memiliki fungsionalitas dan banyak lagi
  • Penerus SH
  • BASH adalah SHELL default

MATERI REFERENSI:

SHELL gnu.org:

Pada dasarnya, sebuah shell hanyalah sebuah prosesor makro yang mengeksekusi perintah. Istilah prosesor makro berarti fungsionalitas di mana teks dan simbol diperluas untuk membuat ekspresi yang lebih besar.

A Unix Shell adalah penerjemah perintah dan bahasa pemrograman. Sebagai penerjemah perintah, shell menyediakan antarmuka pengguna ke rangkaian kaya utilitas GNU. Fitur bahasa pemrograman memungkinkan utilitas ini untuk digabungkan. File yang berisi perintah dapat dibuat, dan menjadi perintah itu sendiri. Perintah-perintah baru ini memiliki status yang sama dengan perintah sistem dalam direktori seperti / bin, yang memungkinkan pengguna atau grup untuk membuat lingkungan kustom untuk mengotomatiskan tugas-tugas umum mereka.

Kerang dapat digunakan secara interaktif atau non-interaktif. Dalam mode interaktif, mereka menerima input yang diketik dari keyboard. Ketika menjalankan non-interaktif, shell mengeksekusi perintah yang dibaca dari file.

Shell memungkinkan eksekusi perintah GNU, baik secara sinkron maupun asinkron. Shell menunggu perintah sinkron untuk diselesaikan sebelum menerima input lebih banyak; perintah asynchronous terus dieksekusi secara paralel dengan shell saat ia membaca dan menjalankan perintah tambahan. Konstruk redirection memungkinkan kontrol input dan output dari perintah-perintah tersebut. Selain itu, shell memungkinkan kontrol atas isi lingkungan perintah.

Shells juga menyediakan seperangkat kecil perintah built-in (builtin) yang mengimplementasikan fungsionalitas yang tidak mungkin atau tidak nyaman untuk didapatkan melalui utilitas terpisah . Sebagai contoh, cd, break, continue, dan exec tidak dapat diimplementasikan di luar shell karena mereka secara langsung memanipulasi shell itu sendiri. History, getopts, kill, atau pwd builtins, antara lain, dapat diimplementasikan dalam utilitas yang terpisah, tetapi mereka lebih nyaman digunakan sebagai perintah builtin. Semua builtin shell dijelaskan di bagian selanjutnya.

Sementara mengeksekusi perintah sangat penting, sebagian besar kekuatan (dan kompleksitas) shell adalah karena bahasa pemrograman yang tertanam. Seperti bahasa tingkat tinggi, shell menyediakan variabel, konstruksi kontrol aliran, penawaran, dan fungsi.

Shells menawarkan fitur yang dirancang khusus untuk penggunaan interaktif daripada untuk menambah bahasa pemrograman. Fitur-fitur interaktif ini termasuk kontrol pekerjaan, pengeditan baris perintah, riwayat perintah dan alias. Masing-masing fitur dijelaskan dalam manual ini.

BASH gnu.org:

Bash adalah shell, atau interpreter bahasa perintah, untuk sistem operasi GNU. Namanya adalah akronim untuk 'Bourne-Again SHell', plesetan tentang Stephen Bourne, penulis leluhur langsung dari Unix shell sh saat ini, yang muncul dalam Seventh Edition Bell Labs Research versi Unix.

Bash sebagian besar kompatibel dengan sh dan menggabungkan fitur-fitur yang berguna dari Korn shell ksh dan C shell csh. Ini dimaksudkan untuk menjadi implementasi yang sesuai dari IEEE POSIX Shell dan bagian Tools dari spesifikasi IEEE POSIX (Standar IEEE 1003.1). Ini menawarkan peningkatan fungsional lebih dari sh untuk penggunaan interaktif dan pemrograman.

Sementara sistem operasi GNU menyediakan shell lain, termasuk versi csh, Bash adalah shell default . Seperti perangkat lunak GNU lainnya, Bash cukup portabel. Saat ini berjalan di hampir setiap versi Unix dan beberapa sistem operasi lainnya - ada port yang didukung secara independen untuk platform MS-DOS, OS / 2, dan Windows.

Timothy LJ Stewart
sumber
14

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.

Andrzej Pronobis
sumber
Ini pada dasarnya apa jawaban saya sampai sekarang benar-benar bermuara. +1
tripleee
7

Mereka hampir identik tetapi bashmemiliki lebih banyak fitur - shadalah (kurang lebih) bagian yang lebih tua dari bash.

shsering berarti yang asli Bourne shell, yang mendahului bash( 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/shatau menggunakan shshell biasanya melakukannya untuk kompatibilitas mundur. OS unix / linux apa pun akan memiliki shshell. Di Ubuntu shsering memanggil dashdan pada MacOS itu adalah versi POSIX khusus bash. Kerang ini mungkin lebih disukai untuk perilaku yang sesuai standar, kecepatan atau kompatibilitas ke belakang.

bashlebih baru dari aslinya sh, menambahkan lebih banyak fitur, dan berusaha untuk kompatibel dengan sh. Secara teori, shprogram harus dijalankan bash. bashtersedia di hampir semua mesin linux / unix dan biasanya digunakan secara default - dengan pengecualian MacOS default ke zshCatalina (10.15). FreeBSD, secara default, tidak datang dengan bashdiinstal.

Ryan Taylor
sumber
shjauh sebelum POSIX. Hari ini, Anda akan berharap bahwa apa pun yang shAnda 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.
tripleee
Saya menghapus hal-hal tentang POSIX agar tidak membingungkan
Ryan Taylor
3

/bin/shmungkin atau mungkin tidak menjalankan program yang sama dengan /bin/bash.

shmendukung 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. Ketik info bashdan baca bagian "Fitur Bash" (bagian 6 dalam versi saat ini), atau baca dokumentasi saat ini secara online .

Keith Thompson
sumber
shhanya memberi Anda shell POSIX, jika Anda memiliki hak yang PATHdiatur di shell Anda saat ini. Tidak ada nama PATH yang ditentukan yang memberi Anda shell POSIX.
schily
Untuk waktu yang lama, bahkansh tidak perlu memberi Anda shell POSIX, pada Solaris, misalnya.
tripleee
3

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.

Gopika BG
sumber
0

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

Raihanhbh
sumber
Untuk memahami POSIX, baca respons dari Alex Silakan periksa: stackoverflow.com/a/1780614/1261003
Raihanhbh
Saya tidak mencoba memahami POSIX. Saya sedang meninjau Jawaban Anda dan karena itu saya perlu melihatnya Jawaban Anda menambah nilai. Saya kira tidak.
Scratte
Saya percaya klarifikasi kecil ini akan membantu seorang pemula untuk memahami jargon yang digunakan dalam diskusi di atas dengan lebih nyaman. @Scratte
Raihanhbh
-1

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.

ruam
sumber
Ada cangkang sebelumnya oleh Ken Thompson. Shell Bourne secara resmi diperkenalkan di v7 Unix (1979).
tripleee