Fitur unik bash dibandingkan dengan zsh

67

Saya telah menjadi pengguna zsh selama beberapa waktu (sebelum tcsh itu dan sebelum csh itu). Saya cukup senang dengan itu, tetapi bertanya-tanya apakah ada fitur menarik dari bash yang tidak ada di zsh. Dan sebaliknya, apakah ada fitur zsh yang tidak ada di bash. Perasaan saya saat ini adalah bahwa bash lebih baik:

  • Jika Anda sudah terbiasa dan tidak ingin mempelajari sintaks baru.
  • Ini akan ada pada sebagian besar semua mesin * nix secara default, sedangkan zsh mungkin merupakan instalasi tambahan.

Tidak mencoba memulai pertempuran agama di sini, itulah sebabnya saya hanya mencari fitur yang hanya ada di salah satu kerang.

Tim
sumber
10
Bagaimana fitur yang unik untuk satu atau yang lain subjektif? Sejujurnya saya tidak mencari flamewar dan mengakui bahwa keakraban satu atau yang lain kemungkinan merupakan alasan yang baik untuk memilih shell itu.
Tim

Jawaban:

40

zsh untuk vulcan. ;-)

Serius: bash 4.0 memiliki beberapa fitur yang sebelumnya hanya ditemukan di zsh, seperti ** globbing:

% ls /usr/src/**/Makefile

setara dengan:

% find /usr/src -name "Makefile"

tapi jelas lebih kuat.

Dalam pengalaman saya penyelesaian bash yang dapat diprogram berkinerja sedikit lebih baik daripada zsh, setidaknya untuk beberapa kasus (menyelesaikan paket debian untuk aptitude misalnya).

bash Alt + .harus memasukkan!$

zsh has expansion of all variables, so you can use e.g.

% rm !$<Tab>

for this. zsh can also expand a command in backtics, so

% cat `echo blubb | sed 's/u/a/'`<Tab>

yields

% cat blabb

I find it very useful to expand rm *, as you can see what would be removed and can maybe remove one or two files from the commmand to prevent them from being deleted.

Also nice: using the output from commands for other commands that do not read from stdin but expect a filename:

% diff <(sort foo) <(sort bar)

From what I read bash-completion also supports completing remote filenames over ssh if you use ssh-agent, which used to be a good reason to switch to zsh.

Aliases in zsh can be defined to work on the whole line instead of just at the beginning:

% alias -g ...="../.."
% cd ...
0x89
sumber
8
Dalam bash, C-M-eke "shell-expand-line", yang akan diperluas cat `echo blubb | sed 's/u/a/'` ke cat blabbdan echo $SHELLke echo /bin/bashdalam kasus saya. Juga, C-x *untuk "glob-expand-word", yang akan berkembang rm *.
Victor
16

Saya ingin menunjukkan bahwa bash tidak diinstal secara default pada FreeBSD, OpenBSD, atau NetBSD, dan itu juga tidak diinstal secara default pada Solaris 10 (OpenSolaris memilikinya sebagai default), terakhir kali saya menggunakan AIX, dan atau Server HP-UX juga tidak diinstal secara default.

Juga, pada OpenSolaris / bin / sh BUKAN bash. Itu ksh. Masalah terbesar yang saya miliki sebagai porter perangkat lunak adalah orang-orang yang menganggap / bin / sh adalah bash dan akan menerima sintaks bash extended. Walaupun hal ini tampaknya menjadi masalah pada sebagian besar distribusi Linux, ini tidak terjadi di tempat lain dan itu benar-benar menjengkelkan.

X-Istence
sumber
6
Ya kamu benar. Sayangnya, semua vendor ini yakin membuatnya sangat mudah untuk menginstal bash sebagai paket tambahan. +1 untuk menunjukkan perlunya / bin / sh purism dalam skrip.
kubanczyk
@kubanczyk: Jika Anda bekerja pada mesin yang tidak memiliki akses root, maka mungkin tidak mudah untuk menginstal, jadi saya pikir titik X-Istence berdiri. (Saya mengerjakan banyak kotak Solaris, dan sysadmin semuanya adalah pecandu ksh. Terakhir kali saya mencoba mengkompilasi perangkat lunak saya sendiri yang tidak dapat saya jalani tanpa (git dalam kasus ini) ada kekurangan dengan kompiler yang diinstal, jadi bahkan rute itu terputus untuk saya.)
iconoclast
12

Meskipun saya pengguna bash, saya menemukan salah satu fitur zsh yang cukup keren: RPS1.

Ingat:

  • PS1: prompt rata kiri
  • RPS1: prompt selaras kanan

Sampel:

Saat menggunakan sesuatu seperti

PS1=’%B(%h) %m%#%b 
RPS1=’(%20<…<%~)'

Anda mendapatkan prompt Anda di sebelah kiri dan direktori saat ini didorong ke kanan. Bahkan menghilang ketika garis saat ini terlalu lama! Itu karena zsh cukup pintar untuk memberikan prioritas rendah ke RPS1.

Anda dapat melihat tangkapan layar dari contoh ini di http://imgur.com/OAZhC .

Chucky
sumber
9

Zsh memiliki koreksi ejaan. Jika Anda libur (atau lebih) surat, itu akan mencari tahu apa yang Anda maksudkan.

Ini juga memiliki penyelesaian tab yang lebih kuat, yang saya suka.

Zsh memiliki utilitas konfigurasi interaktif untuk mengaturnya sesuka Anda.

Beberapa tes kecepatan mengatakan zsh lebih cepat, tetapi saya belum melihat adanya perbedaan.

Tukang sihir
sumber
1
Versi strip dasbor yang hanya mendukung sebagian dari fitur-fiturnya, dan dirancang untuk digunakan dalam skrip yang harus berjalan cepat (misalnya startup) adalah dash.
Chucky
zshbahkan memiliki pengaturan untuk memungkinkan kesalahan 'one letter off' untuk penggunaan keyboard Dvorak.
vgoff
6

Saya tidak tahu adanya fitur bash yang tidak didukung zsh. Tujuan desain zsh tampaknya termasuk mendukung semua fitur yang ditambahkan bash.

Saya masih menggunakan bash bukan zsh. Saya jarang menemukan fitur menarik yang mendukung zsh yang tidak dimiliki bash. Masalah sesekali dengan zsh selama bertahun-tahun, atau tidak ada pada sistem tertentu, membuatnya tidak layak melakukan transisi.

Saya akhirnya dapat menggunakan shell yang sama pada setiap sistem Unix, tidak ada baiknya melanggar ini untuk fitur yang tidak akan pernah saya gunakan.

Fitur-fitur yang ada di zsh yang tidak ada di bash tampaknya sebagian besar imut tetapi bukan yang akan berarti setiap hari.

carlito
sumber
3

bash memiliki banyak fitur yang dulunya hanya ada di zsh. Anda dapat memiliki 'penyelesaian tab pintar' dengan bash juga sekarang, seperti yang ditemukan oleh pengguna ubuntu baru-baru ini.

Rory
sumber
1

Substitusi proses dan globbing diperpanjang adalah dua fitur yang paling saya akan lewatkan. Pengaturan prompt juga cukup keren - melihat tingkat sarang ketika Anda mengetik pernyataan kompleks pada baris perintah. Autoloading membuat termasuk banyak fungsi di setiap shell yang layak.


sumber
Saya berasumsi Anda berarti Anda akan kehilangan yang dari zsh, karena AFAIK semua yang Anda sebutkan termasuk dalam zsh? (Tapi apakah Anda yakin mereka semua absen dari bash? Itu akan mengejutkan saya.) Bagaimanapun, menambahkan itu akan membuat jawaban Anda lebih jelas, karena ada orang yang menjawab di kedua sisi pagar bash / zsh. Selain itu, akan sangat membantu jika Anda memberikan contoh bagaimana masing-masing fitur tersebut membuat masa pakai shell Anda lebih mudah.
iconoclast
0

Saya penggemar zsh karena dukungan mode vi, tetapi saya menemukan bahwa ini tidak terlalu banyak digunakan. Saya pikir saya membaca bahwa zsh suka mengambil fitur populer dari shell lain dan menggabungkannya (jadi hal-hal khusus untuk bash dan hal khusus untuk csh keduanya tersedia di zsh).

Seseorang juga mengatakan bahwa saya melenturkan faktor geek saya dengan menggunakan zsh, tetapi saya tidak dapat mengkonfirmasi atau menyangkal rumor itu.

Milner
sumber
5
dan ya, bash juga memiliki dukungan mode-vi.
pjz
@Milner: dapatkah Anda menjelaskan seperti apa dukungan mode vi di zsh yang tidak ada dalam bash? Jika Anda hanya bermaksud melakukan set -o vi pada baris perintah, maka itu jelas di keduanya. Jika ada beberapa dukungan tambahan di zsh, dapatkah Anda menjelaskan dengan jelas apa itu dan apa yang ditambahkan?
iconoclast
-1

Popularitas, #bash 430 pengguna. #zsh 123 pengguna. Saya percaya situs web zsh memiliki perbandingan zsh yang baik dengan cangkang lainnya. zsh memiliki dukungan mode vi yang lebih baik.

Ian Kelling
sumber
2
Bagaimana mode-vi di zsh lebih baik? Saya pengguna bash dan saya memiliki mode-vi aktif, jadi saya ingin tahu apakah ada manfaat dalam beralih.
ptman
1
@ptman: zsh's prompt dapat dibuat untuk memberitahu mode (masukkan / normal). Readline tidak dapat melakukan itu. Pembisiknya juga lebih fleksibel: Anda dapat memiliki penyorotan sintaks dll!
unperson325680
@progo: ahh! sangat bagus. Sekarang saya mungkin mulai menggunakan mode vi di zsh. Itulah salah satu alasan saya untuk tetap menggunakan mode emacs sejauh ini.
iconoclast
@ Brandon bahwa sedikit peningkatan adalah alasan bagi saya untuk mengganti kerang.
unperson325680
-1

Bash menggunakan sintaks yang sama untuk if dan while karena itu dapat digunakan dalam skrip / bin / sh pada baris perintah.
Dalam zsh sintaksnya berbeda. Secara efektif menggunakan zsh Anda harus mengingat keduanya, jika Anda menggunakan pernyataan if- atau while-pada baris perintah Anda

Michèle
sumber
1
Saya mencoba ini, menggunakan if [[ $test = "test" ]]; then echo "success"; else echo "failure"; fipada kedua baris perintah dan skrip, dan itu berfungsi seperti yang diharapkan dalam kedua kasus. Jadi sepertinya fakta Anda tidak benar.
iconoclast
Ini tergantung pada apa yang Anda instal sebagai / bin / sh. Jika / bin / sh adalah bash, maka Anda benar. Kalau tidak, bash tidak memiliki keunggulan ini. Jika zsh adalah / bin / sh, zsh memiliki keunggulan ini. Mengingat semua shell berbeda yang dapat menyediakan / bin / sh, saya pribadi merekomendasikan hanya menggunakan shell yang Anda inginkan untuk skrip shell, sehingga ketidakhadirannya menunjuk ke masalah dengan perbaikan yang jelas, daripada perilaku aneh tanpa petunjuk tentang cara menyelesaikan.
Ed Grimm