Bash'ın zsh ile karşılaştırıldığında Eşsiz Özellikleri


67

Bir süredir bir zsh kullanıcısı oldum (bu tcsh'den önce ve bu csh'den önce). Ondan oldukça mutluyum, ancak bash'ın zsh'da bulunmayan zorlayıcı özelliklerinin olup olmadığını merak ediyordum. Ve tam tersi, bash'de bulunmayan zsh özellikleri var mı. Şu anki hissim şu bash daha iyi.

  • Zaten aşina iseniz ve yeni sözdizimi öğrenmek istemiyorsanız.
  • Varsayılan olarak tüm * nix makinelerinde mevcut olacak, zsh ekstra bir kurulum olabilir.

Burada dini bir savaş başlatmaya çalışmıyorum, bu yüzden sadece mermilerden birinde var olan özellikleri arıyorum.


10
Birine veya diğerine özgü benzersiz özellikler nasıl? Dürüst olmak gerekirse, yeni bir alev aramıyorum ve birinin ya da diğerinin aşina olmasının, bu kabuğu tercih etmek için iyi bir neden olduğunu kabul ediyorum.
Tim

Yanıtlar:


40

zsh vulkanlar içindir. ;-)

Cidden: bash 4.0, daha önce sadece zsh'da bulunan, ** globbing gibi bazı özelliklere sahip:

% ls /usr/src/**/Makefile

eşittir:

% find /usr/src -name "Makefile"

ama belli ki daha güçlü.

Tecrübelerime göre bash'ın programlanabilir tamamlanması, en azından bazı durumlarda (örneğin yetenek için debian paketlerini tamamlayarak), zsh'lerden biraz daha iyi bir performans sergiliyor.

bash Alt + .eklemek zorunda!$

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 ...

8
Bash olarak, C-M-e"kabuk-line genişletmek", artıracağı için hangi cat `echo blubb | sed 's/u/a/'` için cat blabbve echo $SHELLhiç echo /bin/bashbenim durumumda. Ayrıca, C-x *genişletmek "glob-genişletin-kelime" için rm *.
Victor,

16

FreeBSD, OpenBSD veya NetBSD’de bash’ın varsayılan olarak yüklenmediğini ve Solaris 10’da da varsayılan olarak yüklenmediğini (OpenSolaris’in varsayılan olarak aldığı), AIX’i en son kullandığımda ve HP-UX sunucular da varsayılan olarak yüklenmedi.

Ayrıca, OpenSolaris / bin / sh üzerinde bash DEĞİLDİR. Bu ksh. Yazılım porter olarak sahip olduğum en büyük sorun / bin / sh bash olduğunu ve bash genişletilmiş sözdizimini kabul edeceğini varsayıyor. Çoğu Linux dağıtımında durum böyle görünse de, başka hiçbir yerde durum böyle değil ve gerçekten can sıkıcı bir durum.


6
Evet haklısın. Ne yazık ki, tüm bu satıcılar bash'ı ekstra bir paket olarak kurmayı çok kolaylaştırıyor. Kodlarda / bin / sh purism ihtiyacını belirtmek için +1.
kubanczyk

@kubanczyk: Eğer root erişiminiz olmayan makineler üzerinde çalışıyorsanız, kurulumu o kadar kolay olmayabilir, bu yüzden X-Istence'ın amacının geçerli olduğunu düşünüyorum. (Bir sürü Solaris kutusu üzerinde çalışıyorum ve sistem yöneticileri hepsi ksh bağımlısı. Son kez onsuz yaşayamadığım kendi yazılımımı derlemeye çalıştım (bu durumda git) yüklü derleyicide eksiklikler vardı, hatta bu rota benim için kesildi.)
iconoclast

12

Bir bash kullanıcısı olmama rağmen, zsh'nin özelliklerinden birini oldukça havalı buluyorum: RPS1.

Hatırlamak:

  • PS1: sola hizalı istemi
  • RPS1: doğru hizalanmış istemi

Numune:

Gibi bir şey kullanırken

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

Komut isteminizi sola alırsınız ve geçerli dizin sağa itilir. Mevcut çizgi çok uzadığında bile kayboluyor! Bunun nedeni, zsh'ın RPS1'e düşük öncelik vermek için yeterince akıllı olmasıdır.

Bu örneğin ekran görüntüsünü http://imgur.com/OAZhC adresinde görebilirsiniz .


9

Zsh yazım düzeltmesine sahip. Eğer bir mektup (ya da daha fazla) kapalıysanız, ne demek istediğinizi çözecektir.

Ayrıca sevdiğim, daha sağlam bir sekme tamamlama özelliğine sahip.

Zsh, istediğiniz gibi ayarlamanızı sağlamak için etkileşimli bir yapılandırma yardımcı programına sahiptir.

Bazı hız testleri zsh'nin daha hızlı olduğunu söylüyor, ancak ben hiçbir fark fark etmedim.


1
Yalnızca özelliklerinin bir alt kümesini destekleyen ve hızlı çalışması gereken komut dosyalarında kullanılmak üzere tasarlanmış (örneğin başlangıç ​​sürümleri), kısa bir çizgi sürümü.
Chucky

zshDvorak klavye kullanımı için 'tek harfli' yazım hatalarına izin verecek bir ayar bile vardır.
vgoff

6

Zsh'nin desteklemediği hiçbir bash özelliğini bilmiyorum. Zsh'ın tasarım hedefi, bash'ın eklediği tüm özellikleri desteklemeyi içeriyor gibi görünüyor.

Hala zsh yerine bash kullanıyorum. Çok nadiren zsh'nin bash'ın desteklemediği zorlayıcı özelliklerle karşılaşıyorum. Yıllar boyunca zsh ile ilgili zaman zaman yaşanan problemler ya da belirli sistemlerde mevcut değildir, geçişi yapmaya değmez hale getirmiştir.

Sonunda her Unix sisteminde aynı kabuğu kullanabiliyorum, asla kullanmayacağım özellikler için buna değmez.

Bash'de bulunmayan zsh'da bulunan özellikler çoğunlukla sevimli görünüyor, ancak günlük olarak önemli olanları değil.


3

bash, sadece zsh ile kullanılan birçok özelliğe sahiptir. Herhangi bir son ubuntu kullanıcısının keşfettiği gibi, şimdi bash ile 'akıllı sekme tamamlama' yapabilirsiniz.


1

Proses ikame ve genişletilmiş globbing, en çok özleyeceğim iki özellik. Bilgi istemi ayarları da oldukça harika - komut satırlarına karmaşık ifadeler yazarken iç içe geçme seviyesini görebilirsiniz. Otomatik yükleme, her kabuğa çok sayıda fonksiyonun dahil edilmesini sağlar.


Sanırım zsh’den olanları özleyeceğinizi söylüyorsunuz, zira AFAIK’te bahsettiğiniz her şey zsh’e dahil edildi mi? (Ama hepsinin bashtan yoksun olduğundan emin misiniz? Bu beni şaşırtacaktır.) Herhangi bir oranda bash / zsh çitinin her iki tarafında da yanıt veren insanlar olduğu için cevabınızı netleştirecek. Ayrıca, bu özelliklerin her birinin kabuk ömrünü nasıl kolaylaştırdığı konusunda örnekler verirseniz, size yardımcı olacaktır.
iconoclast

0

Vi modu desteği nedeniyle zsh hayranıyım, ancak çok yaygın kullanılmadığını keşfediyorum. Zsh'nin diğer mermilerden popüler özellikler almayı ve bunları birleştirmeyi sevdiğini düşünüyorum.

Birisi de zsh kullanarak inek faktörümü büktüğümü söyledi, ancak bu söylentiyi onaylayamıyorum veya inkar edemiyorum.


5
ve evet, bash ayrıca vi-mod desteğine sahiptir.
pjz

@Milner: zsh'de ne tür bir vi modu desteğinin bash'da olmadığını açıklayabilir misiniz? Komut satırında -o vi ayarını yapmayı kastediyorsanız, bu açıkça her ikisinde dedir. Zsh’de genişletilmiş bir destek varsa, ne olduğunu ve neler eklediğini net bir şekilde açıklayabilir misiniz?
iconoclast

-1

Popülerlik, #bash 430 kullanıcıları. #zsh 123 kullanıcı. Zsh web sitesinin zsh ile diğer kabukları iyi bir şekilde karşılaştırdığına inanıyorum. zsh daha iyi vi mod desteğine sahiptir.


2
Zsh içindeki vi-mode nasıl daha iyidir? Ben bir bash kullanıcısıyım ve vi-mode'um var, bu yüzden anahtarlamanın yararı olup olmadığını bilmek istiyorum.
ptman

1
@ ptman: zsh komutu modu anlatmak için yapılabilir (insert / normal). Readline bunu yapamaz. Bilgi istemi de daha esnektir: sentaks vurgulama vb.
unperson325680

@progo: ahh! çok hoş. Şimdi sadece olabilir zsh içinde vi modunu kullanarak başlayın. Şimdiye kadar emacs moduna bağlı kalmamın sebeplerinden biri buydu.
iconoclast

@ Bu küçük geliştirme kabukları değiştirmem için sebep olmuştu.
unperson325680

-1

Bash, komut satırındaki / bin / sh komut dosyalarında kullanılabiliyorsa, aynı sözdizimini kullanıyor.
Zsh içinde sözdizimi farklıdır. Komut satırında bir if- veya while ifadesi kullanıyorsanız, zsh kullanarak her ikisini de hatırlamanız gerekir.


1
Bunu if [[ $test = "test" ]]; then echo "success"; else echo "failure"; fihem komut satırında hem de komut dosyasında kullanarak denedim ve her iki durumda da beklendiği gibi çalıştı. Öyleyse gerçeklerin tam olarak belli değil.
iconoclast

Bu, / bin / sh olarak ne kurduğunuza bağlıdır. Eğer / bin / sh bash ise, haklısın. Aksi takdirde, bash bu avantaja sahip değildir. Eğer zsh / bin / sh ise, zsh bu avantaja sahiptir. / Bin / sh 'i sağlayabilen farklı mermilerin tümü göz önüne alındığında, şahsen sadece kabuk betiği için istediğiniz kabuğun kullanılmasını tavsiye ederim, böylece yokluğu, nasıl yapılacağına dair hiçbir ipucu olmayan tuhaf bir davranıştan ziyade bariz bir düzeltmeyle ilgili bir soruna işaret eder. çözmek, gidermek, çözümlemek.
Ed Grimm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.