Apakah ada alasan untuk menggunakan bash over zsh? [Tutup]

33

Saya ingin tahu mengapa orang ingin menjalankan bash, bukan zsh. Maksud saya zsh sepenuhnya kompatibel dengan bash. Jangan salah paham: Saya tidak suka bash atau apa pun. Saya benar-benar ingin tahu apakah ada keuntungan menggunakan zsh.

Jadi apa alasannya menggunakan bash over zsh?

Jason Baker
sumber
2
Hanya ingin menunjukkan bahwa ZSH tidak sepenuhnya kompatibel dengan BASH. Dalam ZSH, pengindeksan array dimulai pada 1 - dalam BASH, pengindeksan array dimulai pada 0. Ada perbedaan lain juga, tapi saya ingin menunjukkan ini.
Charles Addis

Jawaban:

29

Ada dua alasan yang muncul:

Pertama - tersedia secara praktis di mana saja. Saya memiliki beberapa sistem Linux (CentOS 4.x dalam hal ini) yang tidak menginstal zsh. Demikian pula saya harus menyentuh sistem kuno seperti Solaris 2.6 dan ke atas, HP-UX 10 ke atas, dan versi AIX yang berderit. Oleh karena itu saya cukup banyak harus menggunakan bash pada komputer ini, yang saya lakukan karena saya menyentuh puluhan, jika tidak ratusan, masing-masing komputer selama sebulan, dan untuk mendapatkan konsistensi dalam antarmuka Anda, Anda akhirnya terjebak menggunakan standar.

Kedua - ini tersedia hampir di mana-mana. Ini berarti saya dapat menulis skrip bash shell dan memastikan 99% bahwa itu akan berfungsi ketika ditransfer ke tempat lain.

Ya, alasan-alasan ini pada dasarnya sama, tetapi alasan di baliknya berbeda.

David Mackintosh
sumber
2
Saya ingat memiliki ksh88 / ksh93 di HPUX, kami tidak pernah memiliki akses untuk menginstal bash.
Zlemini
24

Bash umumnya datang dengan setiap sistem, zsh tidak. Saya suka zsh, tetapi karena ini, saya menggunakan zsh untuk penggunaan interaktif, tetapi Bash untuk semua skrip saya .

Saya menemukan ini membuat semuanya lebih sederhana, bahkan ketika saya berbelanja apa pun bash yang kompatibel (setopt SH_WORD_SPLIT?), Saya masih mengalami perbedaan yang halus.

Kyle Brandt
sumber
3
Itu adalah setiap sistem GNU / Linux yang Anda maksud?
andol
2
Yah saya telah menemukan itu datang dengan OS / X dan bsd, saya tidak punya banyak pengalaman dengan * nix lain, apakah mereka (versi terbaru) biasanya tidak memiliki bash?
Kyle Brandt
1
Versi Solaris yang lebih lama tidak termasuk bash; Saya biasanya harus bergantung pada Bourne sebagai shell untuk scripting. Ini tidak terjadi untuk sementara waktu, tetapi Anda mungkin masih mengalami di beberapa perusahaan besar.
user5336
3
Harus berbeda BSD: s lalu. Paling tidak di OpenBSD dan di FreeBSD Anda harus menginstal bash secara terpisah dari port / paket.
andol
andol: Itulah yang biasa saya gunakan .. Saya harus ingat salah, atau saya melakukan itu dan hanya tidak ingat.
Kyle Brandt
13

zsh tidak sepenuhnya kompatibel dengan bash. Ada berbagai perbedaan. Zsh yang lebih baru lebih kompatibel dengan bash (= ~ didukung, exec sekarang memiliki opsi bendera tambahan, dll) tetapi kompatibilitas penuh bukan tujuan, bahkan di bawah "meniru".

Misalnya, substring bash adalah $ {foo: offset: len} tetapi di zsh itu $ foo [start, end] dan itu hanya satu contoh sederhana.

zsh adalah shell yang dipengaruhi tcsh dan ksh yang melakukan banyak hal dengan caranya sendiri; Kompatibilitas POSIX secara eksplisit bukan tujuan, tetapi pengembang responsif terhadap tambalan yang menambahkan opsi / meniru perilaku yang membuat segalanya lebih dekat dengan POSIX. Tetapi ketika Anda mulai benar-benar memahami kekuatan shell, Anda mulai membuat skrip tulis saja, bahkan lebih dari bash.

bash adalah POSIX sh + ksh + pedanticism, dengan beberapa fitur sekarang disalin dari zsh. Juga memiliki skrip tulis-saja tetapi karena memiliki operator yang kurang kuat, Anda akhirnya tidak menggunakan keringkasan zsh dan hal-hal mungkin lebih mudah dibaca (kecuali untuk semua kutipan untuk menghindari perpecahan spasi putih, $ array bodoh ksh-style $ berarti lebih dulu -element-of-array, bukan semua-elemen-of-array, dll.)

Menulis skrip yang memanfaatkan sepenuhnya kekuatan shell tidak bijaksana, kecuali Anda berada di lingkungan yang dibatasi (mis., Menulis skrip sistem rc, di mana beberapa FSs mungkin tidak dipasang, dll). Sebagai ideal, gunakan Perl / Python / Ruby / apa pun untuk sesuatu yang cukup besar yang Anda butuhkan ekspresif tidak di Bourne sh, jika Anda ingin orang lain dapat mempertahankannya. Simpan barang-barang shell untuk hal-hal yang berkaitan dengan shell interaktif (pemrograman penyelesaian tab, dll).

Saya tidak akan menggunakan bash over zsh. Saya akan menggunakan bsh sh over zsh untuk skrip sederhana, atau beralih ke bahasa di mana array asosiatif memiliki operator yang layak (tidak seperti di zsh, di mana mereka, sekali lagi, 'ringkas'). Saya mungkin mengganti skrip sh ke bash jika saya membutuhkan satu fitur kecil untuk memperpanjang skrip yang sudah terbukti bekerja dan tidak punya waktu untuk menulis ulang sekarang.

Phil P
sumber
6
nb: $ {foo: offset: len} yang sekarang didukung di zsh, untuk kompatibilitas.
Phil P
6

Saran saya: jika Anda menginginkan portabilitas absolut, tulis menggunakan aturan shell Bourne, jangan repot-repot dengan ekstensi shell Korn. Seperti disebutkan, itu adalah beberapa "kotak besar" lama yang tidak memiliki cangkang GNU sama sekali.

Bash sudah melakukan "terlalu banyak". Saya punya teman di tempat kerja yang lebih suka zsh, tapi saya tidak tahu persis apa fungsinya.

Pokoknya, baik menulis untuk shell Bourne (atau "bourne lagi"), atau secara bergantian, jika Anda melakukan skrip khusus untuk sejumlah kecil kotak tertentu, lewati "shell hell" sepenuhnya, dan cukup tulis menggunakan perl atau python (atau apa pun juru bahasa lokal yang Anda instal adalah).

Roboprog
sumber
5

Selain alasan portabilitas yang diberikan di atas, yang lain mungkin bash masih menambahkan fitur.

Misalnya bash v4.x + diperkenalkan:

  • globbing rekursif:

    rm -f ** / *. log

  • autocd:

    Ketik "/ tmp" bukan "cd / tmp"

pawai
sumber
2
Bagaimana cara menyalin bash dari zsh menjadi alasan untuk menggunakan bash?
qqx
5

Ngomong-ngomong, Anda telah diberitahu di sini berkali-kali bahwa bash bisa ditemukan di mana-mana, jadi gunakan itu untuk menulis skrip portabel, yang salah.

Omong kosong. Jika Anda tahu bahwa setiap sistem yang Anda pedulikan memiliki BASH maka itu adalah pernyataan yang sangat masuk akal. BASH memiliki banyak fitur berguna yang tidak dapat ditiru secara wajar di POSIX sh. Penggunaan fitur-fitur non-POSIX yang sembrono bukanlah ide yang bagus tetapi menggunakannya saat Anda benar-benar membutuhkannya.

Portabilitas tidak mutlak. Dapat diperdebatkan seberapa jauh Anda perlu menerimanya, sama seperti hal lainnya. Sebagai contoh, Fedora menggunakan perintah shell untuk membangun paket RPM dan pedoman pengemasan Fedora menyatakan bahwa karena semua paket harus dibuat secara bawaan di Fedora, boleh saja menggunakan semua fitur BASH. Meskipun secara teoritis distro lain tanpa BASH mungkin ingin menggunakan kembali RPM sumbernya, mereka membuat keputusan tentang portabilitas berdasarkan kepraktisan alih-alih mantra "SELALU UZE POSIX !! 1" Anda.

ZSH belum tertangkap sebagai shell default, hanya karena itu adalah ide-ide yang setengah matang.

Craig
sumber
2
Bisakah Anda menjelaskan fitur atau ide mana di zsh yang Anda temukan setengah matang dan mengapa?
funroll
2

Ngomong-ngomong, Anda telah diberitahu di sini berkali-kali yang bashdapat ditemukan secara praktis di mana-mana, jadi gunakan untuk menulis skrip portabel, yang salah .

Cara yang tepat untuk menulis skrip unix portabel adalah menggunakan sh, yang ditemukan di setiap sistem * nix .

Setiap shell lain kecuali shhanya alat interaktif harian Anda.

Ketika datang ke bashvs zsh- bashdibundel dalam lebih *nixesdari zsh, jadi inilah kelemahan menginstal perangkat lunak tambahan ke sistem - Anda harus mempertahankannya. Beberapa orang suka "fitur keren" zsh sehingga mereka suka membayar harga itu, beberapa tidak.

Samat
sumber
2
Banyak implementasi modern sh hanyalah tautan ke bash.
user9517 mendukung GoFundMonica
2
@Iain Ubuntu menggunakan dash secara default, dan bahkan jika shbash, ini memungkinkan mode kompatibilitas ketika dijalankan sebagai sh.
mgorven
2

Poin lain:

Banyak program menyediakan penyelesaian pesta yang keren secara default. Bagi saya itu alasan untuk tidak beralih.

[ditambahkan pada Jul 2013] Nah setelah beberapa tahun menggunakan zsh sejak komentar di atas, saya harus mengatakan penyelesaian tab (bahkan builtin satu, tanpa modifikasi modifikasi paret ketiga) sangat brilian dan sepertinya jauh melampaui yang ditawarkan oleh bash . :)

Wojciech Kaczmarek
sumber
3
Saya berpikir bahwa bekerja dengan zsh juga, dengan tab selesai pada zsh, saya mendapatkan banyak argumen program khusus ...
Kyle Brandt
Menarik. Apakah Anda mengatakan bahwa file penyelesaian bash bekerja dengan zsh, atau hanya beberapa program memiliki hal-hal penyelesaian khusus zsh? Masih ada beberapa tata letak std dari file bash completion yang zsh mungkin atau mungkin tidak pertimbangkan secara otomatis. Sudahkah Anda mengubah konfigurasi zsh Anda untuk membuatnya berfungsi?
Wojciech Kaczmarek
@Wojciech Kaczmarek: Saya pikir Anda menginginkan 19.3 dari yang berikut: zsh.sourceforge.net/Doc/Release/zsh_19.html . Jujur, saya tidak pernah meluangkan waktu untuk benar-benar memahaminya, hanya merobek .zshrc yang saya temukan online :-) Tapi itu akan menyelesaikan argumen baris perintah dari program-program seperti apt, grep, dll ....
Kyle Brandt
5
pelengkapan tab bash sangat mirip dengan sistem pelengkap tab lama zsh. Ini adalah salah satu ide yang disalin dari zsh ke bash (ada yang lain menyalin bash ke zsh). Anda dapat menggunakan skrip penyelesaian yang ditulis untuk bash di zsh, dengan menjalankan "bashcompinit" dan kemudian menggunakan perintah "complete" dan / atau "compgen" di dalam zsh - ini dimungkinkan karena fungsionalitas bash adalah subset dari yang tersedia di zsh dan jadi bisa ditiru. Jadi tidak ada alasan untuk beralih ke bash karena perintah dikirimkan dengan penyelesaian bash.
Phil P