Pertanyaan Apa perbedaan antara #! / Bin / sh dan #! / Bin / bash?


jika saya menulis,

#!/bin/bash
echo "foo"

atau

#!/bin/sh
echo "foo"

keduanya menghasilkan yang sama. Saya telah melihat beberapa skrip dimulai dengan #!/bin/sh atau #!/bin/bash. Apakah ada perbedaan di antara mereka?


211
2018-05-25 03:59


asal




Jawaban:


bash dan sh dua cangkang berbeda. Pada dasarnya bash aku s sh, dengan lebih banyak fitur dan sintaks yang lebih baik. Sebagian besar perintah bekerja sama, tetapi mereka berbeda.

Karena itu, Anda harus menyadari /bin/sh pada kebanyakan sistem akan menjadi tautan simbolis dan tidak akan diaktifkan 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 setidaknya paling umum, dari pengalaman saya). Bahkan, masalah muncul ketika skrip bash akan digunakan #!/bin/sh karena pembuat skrip menganggap tautannya adalah bash padahal tidak harus begitu.

Untuk info lebih lanjut, http://man.cx/sh, http://man.cx/bash.


178
2018-05-25 04:08



Paragraf pertama Anda cukup menyesatkan. "sh" bukan shell sama sekali, tetapi symlink ke yang saat ini dikonfigurasi cangkang sistem, yang pada sistem Linux biasanya baik bash atau dash (versi terbaru dari Ubuntu menggunakan yang terakhir). - thomasrutter
/bin/sh dulu disebut cangkang bourne shell kembali pada tahun 1977. bash adalah shell yang kompatibel / bin / sh bisa digunakan sebagai pengganti kulit bourne yang sesuai posix. en.wikipedia.org/wiki/Bourne_shell - Alex
pesta adalah standar de facto (sangat banyak digunakan) tetapi tidak "standar"; SH pada Ubuntu menggunakan berlari, yang merupakan cangkang yang sesuai dengan Posix, jadi itu benar-benar standar. Saran saya adalah menggunakan berlari sesering mungkin untuk scripting, terutama untuk skrip sisi server. Meskipun pestalebih ekspresif, berlari berjalan cukup jauh lebih cepat dan lebih aman. - Rick-777
@ Rick-777 Jadi, haruskah saya secara eksplisit menaruh #! / Bin / dash di bagian atas skrip saya? Saya juga menulis skrip di mana saya hanya menulis perintah dan menjalankannya dengan ./scriptName dan itu berfungsi dengan baik. Apakah #! / Bin / yourShellHere diperlukan? - user137717
@ Rick-777 Dalam kasus di mana saya mengecualikan #! / Bin / shellName, saya telah menamai file fileName.sh. Apakah itu secara implisit terhubung ke shell sistem yang disukai tanpa menyatakan #! / Bin / sh? - user137717


Pada Linux dan sistem Unix-like lainnya, Anda memiliki banyak pilihan shell.

Shell bertanggung jawab tidak hanya untuk menggambar prompt kecil Anda, tetapi menafsirkan perintah Anda, terutama jika Anda memasukkan logika yang rumit seperti pipa, kondisional, dan sebagainya.

pesta adalah shell yang paling umum digunakan sebagai shell default untuk pengguna sistem Linux. Ini adalah keturunan spiritual dari cangkang lain yang digunakan sepanjang sejarah Unix. Namanya, pesta adalah kependekan dari Bourne-Again Shell, sebuah penghormatan kepada Bourne shell yang dirancang untuk menggantikannya, meskipun ia juga menggabungkan fitur-fitur dari C Shell dan Korn Shell.

Ini dijalankan, hari ini, dari /bin/bash - sistem apa pun dengan bash akan membuatnya dapat diakses di sini.

Bukan hanya pengguna yang menggunakan cangkang. Skrip (skrip shell) perlu kerang untuk menafsirkannya. Ketika Anda menjalankan skrip shell, sistem Anda perlu memulai proses shell untuk mengeksekusi skrip Anda.

Masalahnya adalah, cangkang yang berbeda memiliki inkonsistensi kecil di antara mereka, dan ketika harus menjalankan skrip, ini bisa menjadi masalah nyata. pesta memiliki cukup banyak fitur scripting yang unik hanya untuk bash, dan bukan ke shell lain. Ini bagus, jika Anda selalu akan menggunakan bash untuk menjalankan skrip tersebut. Kerang lain mungkin mencoba untuk meniru bash, atau mematuhi standar POSIX, yang mendukung bash cukup baik (meskipun menambahkan ekstensi sendiri untuk).

Ini mungkin untuk menentukan di bagian atas skrip shell yang shell itu harus dijalankan dengan menggunakan shebang. Skrip dapat menentukan #!/bin/bash pada baris pertama, yang berarti bahwa skrip harus selalu dijalankan dengan bash, bukan shell lain.

/ bin / sh adalah executable yang mewakili cangkang sistem. Sebenarnya, ini biasanya diimplementasikan sebagai link simbolik yang menunjuk ke executable untuk shell mana yang merupakan shell sistem. Shell sistem adalah jenis shell default yang harus digunakan oleh skrip sistem. Dalam distribusi Linux, untuk waktu yang lama ini biasanya merupakan tautan simbolis pesta, begitu banyak sehingga menjadi semacam konvensi untuk selalu menautkan / bin / sh ke bash atau shell yang kompatibel dengan bash. Namun, dalam beberapa tahun terakhir Debian (dan Ubuntu) memutuskan untuk mengganti shell sistem dari bash ke berlari - shell yang mirip - melanggar dengan tradisi panjang di Linux (baik, GNU) menggunakan bash untuk / bin / sh. Dash dilihat sebagai shell yang lebih ringan, dan jauh lebih cepat, yang dapat bermanfaat untuk kecepatan boot (dan hal-hal lain yang memerlukan banyak skrip shell, seperti skrip instalasi paket).

Dash cukup kompatibel dengan bash, berdasarkan standar POSIX yang sama. Namun, itu tidak menerapkan ekstensi bash-specific. Ada skrip yang ada yang digunakan #!/bin/sh (shell sistem) sebagai shebang mereka, tetapi yang membutuhkan ekstensi khusus bash. Ini saat ini dianggap sebagai bug yang harus diperbaiki oleh Debian dan Ubuntu, yang membutuhkan / bin / sh untuk dapat bekerja ketika menunjuk ke dash.

Meskipun Ubuntu cangkang sistem menunjuk ke dasbor, Anda shell login sebagai pengguna terus menjadi bash saat ini. Yaitu, ketika Anda masuk ke emulator terminal di mana saja di Linux, shell login Anda akan menjadi bash. Kecepatan operasi tidak begitu banyak masalah ketika shell digunakan secara interaktif, dan pengguna terbiasa dengan bash (dan mungkin memiliki kustomisasi bash-spesifik di direktori home mereka).

Apa yang harus Anda gunakan saat menulis skrip

Jika skrip Anda memerlukan fitur yang hanya didukung oleh bash, gunakan #!/bin/bash.

Tetapi jika memungkinkan, akan lebih baik untuk memastikan skrip Anda kompatibel dengan POSIX, dan digunakan #!/bin/sh, yang harus selalu, cukup andal, arahkan ke shell sistem POSIX-kompatibel yang disukai dalam instalasi apa pun.


62
2018-05-25 08:31





Selain jawaban sebelumnya, sekalipun /bin/sh adalah tautan simbolis ke /bin/bash, #!/bin/sh tidak sepenuhnya setara dengan #!/bin/bash.

Dari bash (1) halaman manual :

"Jika bash dipanggil dengan nama sh, ia akan mencoba untuk meniru startup   perilaku versi historis sh semaksimal mungkin, sementara   sesuai dengan standar POSIX juga. "

Misalnya sintaks bash spesifik:

 exec  > >(tee logfile.txt)

memberikan kesalahan pada shell yang diawali dengan #!/bin/sh, bahkan dengan link simbolik sh-> bash di tempat.


15
2018-01-14 11:24