Pertanyaan Perbedaan antara sh dan bash


Saat menulis program shell, kami sering menggunakannya /bin/sh dan /bin/bash. Saya biasanya menggunakan bash, tapi saya tidak tahu apa bedanya mereka.

Apa perbedaan utama antara bash dan sh?

Apa yang perlu kita ketahui saat memprogram bash dan sh?


901
2018-04-20 03:33


asal


Jawaban:


Apa itu sh

sh (atau Bahasa Perintah Shell) adalah bahasa pemrograman yang dijelaskan oleh POSIX standar. Ini memiliki banyak implementasi (ksh88, dash, ...). bash juga bisa dianggap sebagai implementasi dari sh (Lihat di bawah).

Karena sh adalah spesifikasi, bukan implementasi, /bin/sh adalah symlink (atau tautan keras) ke implementasi aktual pada kebanyakan sistem POSIX.

Apa itu bash?

bash dimulai sebagai sh-kompatibel implementasi (meskipun mendahului standar POSIX oleh beberapa tahun), tetapi seiring waktu berlalu telah memperoleh banyak ekstensi. Banyak dari ekstensi ini dapat mengubah perilaku skrip shell POSIX yang valid, jadi dengan sendirinya bash bukan shell POSIX yang valid. Sebaliknya, itu adalah dialek bahasa shell POSIX.

bash mendukung a --posix switch, yang membuatnya lebih POSIX-compliant. Ini juga mencoba untuk meniru POSIX jika dipanggil sebagai sh.

sh = bash?

Untuk waktu yang lama, /bin/sh digunakan untuk menunjuk /bin/bash pada sebagian besar sistem GNU / Linux. Akibatnya, hampir aman untuk mengabaikan perbedaan antara keduanya. Tapi itu mulai berubah baru-baru ini.

Beberapa contoh sistem populer di mana /bin/sh tidak menunjuk ke /bin/bash (dan beberapa di antaranya /bin/bash bahkan mungkin tidak ada) adalah:

  1. Sistem Debian dan Ubuntu modern, yang symlink sh untuk dash secara default;
  2. Busybox, yang biasanya dijalankan selama waktu boot sistem Linux sebagai bagian dari initramfs. Ini menggunakan ash implementasi shell.
  3. BSD, dan secara umum semua sistem non-Linux. OpenBSD menggunakan pdksh, keturunan dari shell Korn. FreeBSD sh adalah keturunan dari shell UNIX Bourne asli. Solaris memiliki miliknya sendiri sh yang untuk waktu yang lama tidak memenuhi POSIX; implementasi gratis tersedia dari Proyek pusaka.

Bagaimana Anda bisa tahu apa /bin/sh menunjuk ke sistem Anda?

Komplikasinya adalah itu /bin/sh bisa berupa tautan simbolis atau tautan keras. Jika itu tautan simbolis, a portabel cara mengatasinya adalah:

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

Jika ini tautan yang sulit, cobalah

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

Bahkan, itu -L bendera mencakup symlink dan hardlink, tetapi kerugian dari metode ini adalah bahwa itu tidak portabel - POSIX tidak diperlukan  find untuk mendukung -samefile pilihan, meskipun keduanya GNU temukan dan Menemukan FreeBSD dukung itu.

Shebang line

Pada akhirnya, terserah Anda untuk memutuskan yang mana yang akan digunakan, dengan menulis baris «shebang».

Misalnya.

#!/bin/sh

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

#!/bin/bash

akan menggunakan /bin/bash jika tersedia (dan gagal dengan pesan kesalahan jika tidak). Tentu saja, Anda juga dapat menentukan penerapan lain, mis.

#!/bin/dash

Yang mana yang digunakan

Untuk skrip saya sendiri, saya lebih suka sh untuk alasan berikut:

  • itu standar
  • itu jauh lebih sederhana dan lebih mudah dipelajari
  • itu portabel di sistem POSIX - bahkan jika itu tidak terjadi bash, mereka harus punya sh

Ada keuntungan menggunakan bash demikian juga. Fitur-fiturnya membuat pemrograman lebih nyaman dan mirip dengan pemrograman dalam bahasa pemrograman modern lainnya. Ini termasuk hal-hal seperti variabel lokal dan array scoped. Polos sh adalah bahasa pemrograman yang sangat minimalis.


855
2018-04-20 04:10



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

TL; DR: bash adalah superset dari sh dengan sintaks yang lebih elegan dan lebih banyak fungsi. Aman menggunakan garis bash shebang di hampir semua kasus karena cukup umum di platform modern.

NB: di beberapa lingkungan, sh  aku s  bash. Memeriksa sh --version.


85
2018-04-20 03:43



Posting dari UNIX.COM

Fitur Shell

Tabel ini di bawah ini mencantumkan sebagian besar fitur yang menurut saya akan membuat Anda memilih satu shell di atas yang lain. Ini tidak dimaksudkan sebagai daftar definitif dan tidak menyertakan setiap kemungkinan fitur untuk setiap kemungkinan shell. Fitur hanya dianggap berada dalam cangkang jika dalam versi yang disertakan dengan sistem operasi, atau jika 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 mengirim tcsh atau c shell yang ditingkatkan sendiri (mereka tidak selalu membuatnya jelas bahwa mereka mengirimkan 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 menggunakan shell ini.

Fitur N tidak ada di shell.

F Feature hanya dapat dilakukan dengan menggunakan fungsi shell           mekanisme.

L Perpustakaan readline harus dihubungkan ke shell untuk diaktifkan           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.

42
2017-08-04 06:10



Pertanyaan ini sering dinominasikan sebagai kanonik bagi orang yang mencoba menggunakannya sh dan terkejut bahwa itu tidak berperilaku sama bash. Berikut ini rangkuman singkat dari kesalahpahaman umum dan jebakan.

Pertama, Anda harus memahami apa yang diharapkan.

  • Jika Anda menjalankan skrip Anda sh scriptname, atau jalankan dengan scriptname dan miliki #!/bin/sh dalam peristiwa baris, Anda harus mengharapkan POSIX sh tingkah laku.
  • Jika Anda menjalankan skrip Anda bash scriptname, atau jalankan dengan scriptname dan miliki #!/bin/bash (atau setara lokal) di garis shebang, Anda harus mengharapkan perilaku Bash.

Memiliki shebang yang benar dan menjalankan skrip dengan mengetikkan nama skrip saja (mungkin dengan path relatif) adalah solusi yang lebih disukai. Selain shebang yang benar, ini membutuhkan file skrip untuk mengeksekusi izin (chmod a+x scriptname).

Jadi, bagaimana sebenarnya mereka berbeda?

Referensi Bash manual memiliki bagian yang mencoba untuk menyebutkan perbedaan tetapi beberapa sumber umum kebingungan termasuk

  • [[tidak tersedia di sh (hanya [ yang lebih kikuk dan terbatas).
  • sh tidak memiliki array.
  • Beberapa kata kunci Bash seperti local, function, dan select tidak portabel sh.
  • Bash memiliki banyak ekstensi sintaks C-gaya seperti $'string\nwith\tC\aescapes' dan tiga argumen for((i=0;i<=3;i++)) lingkaran, += Penambahan tugas, dll.
  • Bash mendukung <<<'here strings'.
  • Bash punya *.{png,jpg} dan {0..9} brace ekspansi.
  • ~ mengacu pada $HOME hanya di Bash (dan lebih umum ~username ke direktori home dari username).
  • Bash memiliki substitusi proses dengan <(cmd) dan >(cmd).
  • Bash mendukung coprocesses dengan <> pengalihan.
  • Bash telah secara signifikan memperluas fasilitas untuk aritmatika shell (meskipun masih belum ada dukungan floating-point) dan manipulasi substring variabel dengan ${substring:1:2}, ${variable/pattern/replacement}, konversi kasus, dll.
  • Banyak, banyak ekstensi Bash-only untuk mengaktifkan atau menonaktifkan perilaku opsional dan mengekspos keadaan internal cangkang.
  • Banyak, banyak fitur kenyamanan untuk penggunaan interaktif yang bagaimanapun tidak memengaruhi perilaku skrip.

Ingat, ini adalah daftar singkat. Lihat referensi manual untuk sendok penuh, dan http://mywiki.wooledge.org/Bashism untuk banyak solusi yang baik; dan / atau coba http://shellcheck.net/ yang memperingatkan untuk banyak fitur Bash-only.

Kesalahan umum adalah memiliki #!/bin/bash garis shebang, tapi kemudian menggunakannya sh scriptname untuk benar-benar menjalankan skrip. Ini pada dasarnya menonaktifkan fungsi Bash-only, jadi Anda mendapatkan kesalahan sintaks, mis. untuk mencoba menggunakan array.

Sayangnya, Bash tidak akan memperingatkan saat Anda mencoba menggunakan konstruksi ini saat dipanggil sebagai sh. Itu tidak sepenuhnya menonaktifkan semua Fungsionalitas Bash saja, jadi, jalankan Bash dengan menjalankannya sebagai sh bukan cara yang baik untuk memeriksa apakah skrip Anda benar-benar portabel ash/dash/ POSIX sh.


32
2018-03-08 08:44



Kulit adalah antarmuka antara pengguna dan OS untuk mengakses layanan sistem operasi. Bisa berupa GUI atau CLI (antarmuka Command Line).

SH (Maksud SHell) adalah interpreter command-line shell, untuk sistem operasi Unix / Unix-like. Ini menyediakan beberapa perintah built-in. Dalam bahasa scripting kami menunjukkan interpreter sebagai #!/bin/sh. Itu adalah salah satu yang paling banyak didukung oleh shell lain seperti bash (gratis / terbuka), kash (tidak gratis).

Pesta (Bourne Sebuahmendapatkan sneraka) adalah pengganti shell untuk Bourne shell. Bash adalah superset dari sh. Bash mendukung sh. POSIX adalah seperangkat standar yang mendefinisikan bagaimana sistem POSIX-compliant seharusnya bekerja. Bash sebenarnya bukan shell compliant 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 subkelas dari sh.

21
2018-02-09 09:46



TERMINAL 

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

KULIT

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

SH Vs. PESTA

SH

  • (Kulit)
  • Apakah shell tertentu
  • seorang penerjemah perintah dan bahasa pemrograman
  • Pendahulu dari BASH

PESTA

  • (Bourne-Again SHell)
  • Apakah shell tertentu
  • seorang penerjemah perintah dan bahasa pemrograman
  • Memiliki fungsi sh dan banyak lagi
  • Penerus SH
  • BASH adalah SHELL default

MATERI REFERENSI:

KULIT gnu.org:

Pada dasarnya, a shell hanyalah prosesor makro yang mengeksekusi   perintah. Syarat Prosesor makro berarti fungsi di mana teks dan   simbol diperluas untuk membuat ekspresi yang lebih besar.

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

Kerang dapat digunakan secara interaktif atau non-interaktif. Secara interaktif   mode, mereka menerima masukan yang diketik dari keyboard. Saat mengeksekusi   non-interaktif, shell mengeksekusi perintah yang dibaca dari file.

Sebuah shell memungkinkan eksekusi perintah GNU, baik secara serentak dan   secara asynchronous. Shell menunggu perintah sinkron selesai   sebelum menerima lebih banyak masukan; perintah asynchronous terus dijalankan   sejajar dengan shell saat membaca dan mengeksekusi tambahan   perintah. Konstruksi redirection memungkinkan kontrol halus   input dan output dari perintah-perintah itu. Apalagi shell memungkinkan   kontrol atas isi lingkungan perintah.

Kerang juga menyediakan sekumpulan kecil perintah bawaan (builtins)   mengimplementasikan fungsi yang tidak mungkin atau tidak nyaman untuk diperoleh melalui   utilitas terpisah. Misalnya, cd, break, continue, dan exec tidak bisa   diimplementasikan di luar cangkang karena mereka langsung memanipulasi   cangkang itu sendiri. Sejarah, getop, kill, atau pwd builtins, diantaranya   yang lain, dapat diimplementasikan dalam utilitas terpisah, tetapi mereka lebih   nyaman digunakan sebagai perintah builtin. Semua perangkat shell adalah   dijelaskan dalam bagian selanjutnya.

Saat menjalankan perintah sangat penting, sebagian besar daya (dan   kompleksitas) cangkang adalah karena bahasa pemrograman tertanam mereka.   Seperti bahasa tingkat tinggi lainnya, shell menyediakan variabel, aliran   kontrol konstruksi, mengutip, dan fungsi.

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

PESTA  gnu.org:

Bash adalah shell, atau penerjemah bahasa perintah, untuk GNU   sistem operasi. Namanya adalah akronim untuk 'Bourne-Again SHell',   Pukulan pada Stephen Bourne, penulis leluhur langsung dari   shell Unix saat ini, yang muncul di Seventh Edition Bell Labs   Versi penelitian Unix.

Bash sebagian besar kompatibel dengan sh dan menggabungkan fitur yang berguna   dari shell ksh Korn dan c shell csh. Ini dimaksudkan untuk menjadi   implementasi konkret dari bagian IEEE POSIX Shell dan Tools   spesifikasi IEEE POSIX (IEEE Standard 1003.1). Ini menawarkan   perbaikan fungsional lebih dari sh untuk kedua interaktif dan pemrograman   menggunakan.

Sementara sistem operasi GNU menyediakan cangkang lainnya, termasuk a   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 lain - port yang didukung independen   ada untuk platform MS-DOS, OS / 2, dan Windows.


20
2017-09-03 12:51



Jawaban lain umumnya menunjukkan perbedaan antara Bash dan standar shell POSIX. Namun, ketika menulis skrip shell portabel dan digunakan untuk sintaks Bash, daftar bashisms yang 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 skrip Anda portabel.


14
2018-05-18 02:22