Apa perbedaan mendasar antara shell * NIX mainstream? [Tutup]

52

Apa perbedaan mendasar antara shell * NIX mainstream dan skenario apa yang mungkin mendorong Anda untuk menggunakannya? Saya mengerti bahwa beberapa di antaranya mungkin karena preferensi pengguna tetapi saya hanya pernah menggunakan bash dan saya tertarik untuk mendengar di mana shell lain mungkin berguna.

Juga, apakah ada dampak pada skrip shell yang ditulis pengguna saat berjalan di bawah satu shell atau yang lain atau itu hanya masalah mengubah shell di bagian atas file? Naluriku mengatakan itu tidak mudah.

Conorgriffin
sumber

Jawaban:

52

Untuk penggunaan interaktif, ada dua pesaing utama, bash dan zsh , ditambah straggler tcsh dan ikan pendatang baru .

  • Bash adalah shell resmi dari proyek GNU dan shell default di sebagian besar distribusi Linux. Pada unices lain yang tidak dikirimkan dengan shell interaktif yang layak sebagai bagian dari instalasi basis, saya pikir bash adalah apa yang orang cenderung untuk memilih, dalam penguatan "bash ada di mana-mana jadi saya akan menggunakannya juga" loop. Lihat juga Mengapa pesta di mana-mana? (dengan banyak informasi sejarah).

  • Zsh memiliki hampir setiap fitur bash dan banyak lagi fitur (berguna!). Kelemahan utamanya adalah kurang dikenal, yang secara praktis berarti Anda cenderung tidak menginstalnya pada sistem yang diatur orang lain dan ada sedikit dokumentasi pihak ketiga tentang hal itu. Lihat juga Fitur zsh apa yang Anda gunakan? , Fitur apa yang ada di zsh dan hilang dari bash, atau sebaliknya? .

  • Tcsh dulunya (hingga awal 1990-an) shell dengan fitur interaktif terbaik, seperti pendahulunya csh. Itu membuatnya populer untuk penggunaan interaktif (tetapi tidak untuk skrip ). Zsh mengejar ketinggalan dengan tcsh dan cukup cepat meningkat lebih lanjut, dan bash menyusul (dengan penyelesaian terprogram) pada awal 2000-an, sementara tcsh baru saja membuat kemajuan dalam 15 tahun terakhir. Oleh karena itu ada sedikit alasan untuk belajar tcsh sekarang.

  • Ikan mencoba menjadi lebih bersih dari pendahulunya. Ini memiliki beberapa fitur rapi (sintaksis lebih sederhana, pewarnaan sintaks pada baris perintah) tetapi tidak memiliki yang lain (apa pun yang penulis tidak suka). Komunitas ikan jauh lebih kecil daripada zsh, membuat efeknya lebih akut.


Untuk skrip, ada beberapa bahasa yang ingin Anda targetkan, tergantung pada seberapa portabel skrip yang Anda inginkan.

  • Apa pun yang berpura-pura seperti Unix memiliki shell yang mengandung Bourne/bin/sh . Masih ada beberapa kesatuan komersial di sekitar tempat /bin/shyang tidak sesuai dengan POSIX .

  • Hampir setiap unix yang sekarang berjalan memiliki shexecutable yang setidaknya sesuai dengan setidaknya POSIX.2-1992 dan biasanya setidaknya POSIX: 2001 alias Single Unix v3 . Shell ini mungkin hidup di direktori yang berbeda seperti /usr/bin/posixatau /usr/xpg6/bin. Lapisan emulasi POSIX juga ada untuk hampir setiap sistem yang cukup kuat untuk mendukungnya, menjadikannya target yang menarik.

  • Banyak sistem unix memiliki ksh93 , yang membawa beberapa fitur yang sangat berguna yang POSIX sh kekurangan (array, array asosiatif, gumpalan diperpanjang ( *(foo), @(foo|bar), ...), null gumpalan ( ~(N)foo*), ...). Ksh pada awalnya adalah perangkat lunak komersial (menjadi gratis pada tahun 2000, setelah beberapa kebiasaan telah ditetapkan), dan banyak kesatuan gratis (Linux, * BSD) membiasakan diri dengan hanya menyediakan klon gratis ( pdksh ) yang jauh lebih tua, yang kekurangan banyak fitur berguna ini . Pdksh sekarang semakin tergeser oleh mksh di luar OpenBSD, tetapi bahkan mksh gagal mengimplementasikan semua fitur ksh93. Hari ini, Anda tidak dapat mengandalkan ksh93 yang tersedia di mana-mana, terutama di Linux di mana bash adalah normanya.

  • Bash selalu tersedia di Linux (kecuali beberapa varian yang disematkan) dan sering di unix lain. Ini memiliki sebagian besar fitur berguna ksh93, meskipun kadang-kadang dengan sintaks yang berbeda.

  • Zsh memiliki sebagian ksh93 dan fitur yang berguna bash. Sintaks intinya lebih bersih tetapi tidak kompatibel dengan Bourne. Kecuali untuk macOS, jangan mengandalkan zsh yang tersedia pada sistem yang tidak Anda instal.

  • Untuk skrip lebih lanjut, Anda dapat beralih ke Perl atau Python . Bahasa-bahasa ini memiliki struktur data yang tepat, fitur manipulasi teks yang layak, kombinasi proses yang layak dan mekanisme komunikasi, dan banyak perpustakaan yang tersedia. Sebagian besar sistem unix memilikinya, baik dibundel dengan OS atau dipasang oleh administrator (karena ada begitu banyak skrip Perl dan Python di luar sana yang merupakan sistem langka yang tidak memiliki setidaknya satu dari masing-masing).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
4
Untuk scripting saya menargetkan dasbor, (kecuali saya membutuhkan fitur canggih bash) yang memiliki set fitur minimal, dan merupakan keluhan posix untuk kompatibilitas maksimum. (dan ini ringan dan cepat)
hildred
Dokumentasi yang luar biasa! Dua catatan. Pertama, Solaris adalah salah satu dari "kesatuan komersial di mana / bin / sh tidak sesuai dengan POSIX." Secara khusus, ia menggunakan jsh(yang bukan shell java!), Yang tidak memiliki substitusi variabel seperti ${VAR#foo}dan ${VAR%bar}.
Adam Katz
Kedua, tcshagak populer di kalangan pengguna UNIX yang mempelajari trik mereka sebelum ~ pertengahan 90-an (yang melihat pengenalan keduanya bashdan zsh), terutama di antara para Cpengembang UNIX + yang lebih tua , yang memulai kehidupan dengan csh(pengingat, huruf dalam cshsingkatan Cbahasa , yang merupakan inspirasi untuk perbedaannya dari cangkang gaya bourne). Lihat juga pemrograman Csh yang dianggap berbahaya , yang sering saya gunakan untuk tips tentang sihir POSIX yang mendalam (selain argumen anti-csh).
Adam Katz
Mac OS X tidak pernah "OS / X". (: Dan bagaimana zsh tidak kompatibel dengan Bourne? (Ya, kecuali untuk hal-hal seperti ekspansi variabel tidak memisahkan kata.)
SilverWolf - Reinstate Monica
@seaturtle Bukan ekspansi variabel pemisah-kata adalah perbedaan utama yang akan memecah banyak skrip sh jika Anda mencoba menjalankannya dengan zsh (kecuali jika Anda menjalankan zsh dalam mode emulasi sh / ksh).
Gilles 'SO- berhenti menjadi jahat'
27

Ada dua rasa dasar shell, sh (misalnya, bash) dan csh (misalnya, tcsh). Untuk penggunaan interaktif, sebagian besar tergantung pada apa yang Anda terbiasa. Saya telah menggunakan csh, dan kemudian tcsh, selama bertahun-tahun dan itu akan menyakitkan untuk beralih, hanya karena saya sudah terbiasa dengan itu. Saya telah menggunakan bash juga, dan saya tidak berpikir ada alasan kuat untuk beralih. Kecuali mungkin jika satu atau yang lain tidak tersedia pada mesin yang Anda gunakan secara teratur.

Untuk pemrograman, sintaksnya berbeda. Anda tidak bisa hanya mengganti shell, tetapi perlu mengubah sintaks skrip juga. Untuk skrip, Anda ingin menggunakan sh atau bash. Sintaksnya jauh lebih bisa menerima scripting, seperti yang dijelaskan di sini (terima kasih kepada Riccardo Murri untuk tautannya. Ini adalah panduan yang bagus untuk bash scripting.

Jika Anda belum memutuskan shell, dan Anda berharap untuk menulis beberapa skrip, saya akan menggunakan bash hanya untuk mengurangi jumlah hal yang perlu Anda pelajari.

KeithB
sumber
12

Di masa lalu, ketika AT&T menemukan UNIX, ada Bourne Shell, yang ditulis oleh Steve Bourne. Itu cukup mendasar, dan tidak memiliki banyak alat yang kami terima begitu saja saat ini.

AT&T tidak benar-benar dalam bisnis UNIX, jadi pada saat ini OS yang sangat mendasar diadopsi agak oleh Berkelely, dan mereka membuat beberapa perubahan menjadi BSD UNIX. Di antara banyak perubahan, adalah shell baru, yang disebut csh, yang memiliki banyak perbaikan dibandingkan sh, termasuk kontrol pekerjaan penggunaan interaktif yang lebih baik dan sebagainya. Sayangnya, mereka memutuskan sintaks pemrograman sh mengisap dan membuat sendiri, (agak buruk) disalin dari gaya pengkodean C. (Kata-kata kasar klasik adalah http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ ) Jadi sekarang ada dua sintaksis.

Kemudian, mereka melakukan perbaikan pada CSH menambahkan penyelesaian tab dan beberapa hal lainnya. Ini menjadi tcsh, dan jika Anda menggunakan CSH, ini mungkin yang Anda gunakan.

AT&T memutuskan itu tidak sepenuhnya keluar dari bisnis UNIX, dan mereka juga memolesnya. David Korn (pria baik) menciptakan shell Korn. Berdasarkan ide memperluas sintaksis Bourne shell, itu menambahkan banyak hal untuk kedua programmer dan penggunaan interaktif. Sebenarnya ada beberapa versi, dan Anda mungkin jarang melihat hal-hal seperti ksh88 dan ksh93, yang menunjukkan varian.

Kemudian datanglah FSF dan OS GNU. Mereka ingin membuat OS mereka sendiri yang kompatibel dengan UNIX bernama Hurd, dan menginginkan shell yang lebih baik untuk itu. Mereka memanggil bash, untuk Bourne Again SHell. Aturan POSIX datang hanya sekitar waktu ini, dan mereka ingin membuat para POSIX shell. Mereka melihat sekeliling, mengambil sintaks dari shell Bourne dan perbaikan dari shell Korn, ditambah mencuri dan memperluas fitur interaktif dari tcsh. Itu menjadi shell de facto di Linux, jadi itu sangat umum.

Ada juga zsh, ditulis menjadi shell 'ultimate'. Ini juga sangat umum di dunia Linux. Itu memperpanjang bash (dan diserbuki silang sedikit, beberapa hal baru kembali ke bash).

Jika saya memilih shell, saya akan memilih bash atau zsh. bash mungkin ada di beberapa tempat lebih banyak daripada zsh. zsh lebih kuat, tapi bash baik untukku. Shell Bourne nyata / bin / sh ada hanya karena alasan historis. bash memiliki hampir semua yang ditawarkan ksh dan lebih banyak lagi. Sintaksnya lebih bersih daripada csh atau tcsh, dan memiliki fitur yang lebih baik daripada salah satunya.

Untuk mengonversi skrip tergantung dari apa ke apa. Gaya shell Bourne (sh, ksh, bash, zsh) ke atau dari gaya csh (csh, tcsh) akan sulit. Beralih dari yang lama ke yang lebih baru (/ bin / sh => bash, / bin / ksh => zsh) akan lebih mudah daripada cara lainnya.

Homolka yang kaya
sumber
Perhatikan bahwa halaman csh-whynot ditulis kembali pada bulan September 1995 (periksa tag versi di atas). Saya tidak tahu, tapi saya berharap banyak hal telah berubah dalam 18 tahun sejak itu.
CVn
8

Dua cabang utama cangkang adalah turunan cangkang Bourne (sh, bash, ksh, ash, yash dan zsh) dan turunan csh (tcsh dan ... uhm ... tcsh).

Saya curiga (meskipun saya tidak memiliki angka aktual) bahwa bash adalah yang paling banyak digunakan, tampaknya shell default di sebagian besar linux

Sebagian besar hal yang ditulis dalam satu turunan shell bourne mungkin akan bekerja pada yang lain. Sebagian besar hal yang ditulis dalam shell Bourne mungkin perlu dimodifikasi untuk dijalankan di bawah csh atau tcsh.

Secara pribadi saya menggunakan ksh ketika saya mulai karena itulah yang ada di sistem yang saya gunakan. Saya terutama menggunakan bash sekarang.

mazianni
sumber
1
fish adalah csh terinspirasi shell
hildred
1

Saya telah menggunakan banyak cangkang dari waktu ke waktu. Bukan sesuatu yang super canggih tetapi banyak sysadmin praktis dan hal-hal pemrograman yang membutuhkan penyesuaian yang cukup.

Saya pikir zsh memiliki lebih banyak opsi penyesuaian, setidaknya dulu, tetapi setelah menggunakannya selama beberapa tahun, saya sudah cukup dengan masalah stabilitas dan pengkodean karakter. Bash adalah rock solid, tidak pernah memiliki masalah serupa dan dipasang di mana-mana.

Ari T
sumber