Unikalne cechy bash w porównaniu do zsh


67

Jestem użytkownikiem Zsh od dłuższego czasu (przed tym tcsh i przed tamtym csh). Jestem z tego całkiem zadowolony, ale zastanawiałem się, czy są jakieś atrakcyjne funkcje bash, które nie istnieją w Zsh. I odwrotnie, są funkcje zsh, które nie istnieją w bash. Uważam, że bash jest lepszy:

  • Jeśli znasz go już i nie chcesz się uczyć nowej składni.
  • Będzie domyślnie istniał na większości wszystkich * nix maszyn, podczas gdy zsh może być dodatkową instalacją.

Nie próbuję tutaj rozpoczynać bitwy religijnej, dlatego właśnie szukam funkcji, które istnieją tylko w jednej z powłok.


10
W jaki sposób cechy, które są unikalne dla jednego lub drugiego subiektywu? Szczerze mówiąc, nie szukam ognia ognistego i nie zgadzam się z tym, że znajomość jednego lub drugiego jest prawdopodobnie dobrym powodem, aby preferować tę powłokę.
Tim

Odpowiedzi:


40

zsh jest dla wulkanów. ;-)

Poważnie: bash 4.0 ma pewne funkcje, które wcześniej znajdowały się tylko w zsh, takie jak ** globbing:

% ls /usr/src/**/Makefile

jest równa:

% find /usr/src -name "Makefile"

ale oczywiście mocniejszy.

Z mojego doświadczenia wynika, że ​​programowalne zakończenie bash działa nieco lepiej niż zsh, przynajmniej w niektórych przypadkach (na przykład wypełnianie pakietów debiana dla aptitude).

bash musi Alt + .wstawić!$

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
W bash, C-M-eaby „shell-Expand-line”, która będzie rozwijać cat `echo blubb | sed 's/u/a/'` się cat blabbi echo $SHELLaby echo /bin/bashw moim przypadku. Również C-x *do „glob-expand-word”, który by się rozwinął rm *.
Victor

16

Chciałbym zaznaczyć, że bash nie jest domyślnie instalowany na FreeBSD, OpenBSD lub NetBSD, a także nie jest domyślnie instalowany na Solarisie 10 (OpenSolaris ma go domyślnie), ostatnim razem, gdy użyłem AIX, i lub Serwery HP-UX też nie zostały domyślnie zainstalowane.

Również w OpenSolaris / bin / sh NIE jest bash. To jest ksh. Największe problemy, jakie mam jako programista, to ludzie, którzy zakładają, że / bin / sh to bash i że zaakceptuje rozszerzoną składnię bash. Chociaż wydaje się, że tak jest w przypadku większości dystrybucji Linuksa, nie jest tak w żadnym innym przypadku i jest to naprawdę denerwujące.


6
Tak masz rację. Niestety, wszyscy ci dostawcy sprawiają, że bardzo łatwo jest zainstalować bash jako dodatkowy pakiet. +1 za wskazanie potrzeby puryzmu / bin / sh w skryptach.
kubańczyk

@kubanczyk: Jeśli pracujesz na komputerach, do których nie masz dostępu do roota, instalacja może być trudna, więc myślę, że punkt X-Istence jest słuszny. (Pracuję na kilku systemach Solaris, a sysadmini to ćpunowie ksh. Ostatnim razem, gdy próbowałem skompilować własne oprogramowanie, bez którego nie mogłem żyć (w tym przypadku git), wystąpiły braki w zainstalowanym kompilatorze, więc nawet ta trasa została mi odcięta.)
iconoclast

12

Chociaż jestem użytkownikiem bash, uważam jedną z funkcji zsh za całkiem fajną: RPS1.

Zapamiętaj:

  • PS1: wyrównany do lewej monit
  • RPS1: monit wyrównany do prawej

Próba:

Podczas korzystania z czegoś takiego

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

Otrzymasz monit po lewej stronie, a bieżący katalog zostanie przesunięty w prawo. Znika nawet, gdy bieżąca linia staje się zbyt długa! To dlatego, że zsh jest wystarczająco inteligentny, aby nadać RPS1 niski priorytet.

Zrzut ekranu tego przykładu można zobaczyć na stronie http://imgur.com/OAZhC .


9

Zsh ma korektę pisowni. Jeśli nie masz listu (lub więcej), zrozumiesz, co miałeś na myśli.

Ma również bardziej niezawodne uzupełnianie tabulatorów, co lubię.

Zsh ma interaktywne narzędzie do konfiguracji, aby ustawić go tak, jak lubisz.

Niektóre testy prędkości wskazują, że zsh jest szybszy, ale nie zauważyłem żadnej różnicy.


1
Rozebrana wersja dash, która obsługuje tylko podzbiór jego funkcji, i zaprojektowana do użycia w skryptach, które powinny działać szybko (na przykład podczas uruchamiania), to dash.
Chucky,

zshma nawet ustawienie pozwalające na pomyłki „jednej litery” dla użycia klawiatury Dvorak.
vgoff

6

Nie znam żadnych funkcji bash, które nie obsługuje Zsh. Wydaje się, że celem projektu zsh jest obsługa wszystkich funkcji dodawanych przez bash.

Nadal używam bash zamiast zsh. Rzadko spotykam przekonujące funkcje obsługiwane przez Zsh, których bash nie obsługuje. Sporadyczne problemy z zsh na przestrzeni lat lub jego brak w niektórych systemach, sprawiły, że przejście na nie było warte.

Mogę w końcu użyć tej samej powłoki na każdym systemie Unix, nie warto jej łamać dla funkcji, których nigdy nie użyję.

Funkcje obecne w Zsh, które nie są obecne w bash, wydają się przeważnie urocze, ale nie takie, które miałyby znaczenie na co dzień.


3

bash ma wiele funkcji, które wcześniej były tylko w Zsh. Możesz mieć teraz także „inteligentne uzupełnianie kart” z bash, jak odkrył to każdy niedawny użytkownik ubuntu.


1

Zastępowanie procesów i rozszerzone globowanie to dwie cechy, za którymi najbardziej tęsknię. Ustawienia zachęty są również całkiem fajne - sprawdzanie poziomu zagnieżdżania podczas pisania złożonych instrukcji w wierszach poleceń. Automatyczne ładowanie umożliwia włączenie wielu funkcji do każdej powłoki.


Zakładam, że masz na myśli, że tęsknisz za tymi zsh, skoro AFAIK wszystko, co wspomniałeś, jest zawarte w zsh? (Ale czy jesteś pewien, że wszyscy są nieobecni w bashu? To by mnie zaskoczyło.) W każdym razie dodanie tego by uczyniło twoją odpowiedź bardziej zrozumiałą, ponieważ są ludzie odpowiadający po obu stronach ogrodzenia bash / zsh. Przydałoby się też podać przykłady, w jaki sposób każda z tych funkcji ułatwia życie w powłoce.
iconoclast

0

Jestem fanem Zsh ze względu na obsługę trybu vi, ale odkrywam, że nie jest on powszechnie używany. Myślę, że czytam, że zsh lubi pobierać popularne funkcje z innych powłok i łączyć je (więc rzeczy specyficzne dla bash i rzeczy specyficzne dla csh są dostępne w zsh).

Ktoś powiedział również, że wyginam czynnik maniaków przy użyciu zsh, ale nie mogę potwierdzić ani zaprzeczyć tej plotce.


5
i tak, bash ma także obsługę trybu vi.
pjz

@Milner: czy możesz wyjaśnić, jaki rodzaj obsługi trybu vi jest w Zsh, który nie jest w bash? Jeśli chodzi ci po prostu o możliwość ustawienia -o vi w wierszu poleceń, jest to wyraźnie jedno i drugie. Jeśli jest jakieś rozszerzone wsparcie w Zsh, czy mógłbyś jasno opisać, co to jest i co dodaje?
iconoclast

-1

Popularność, #bash 430 użytkowników. #zsh 123 użytkowników. Wierzę, że strona zsh ma dobre porównanie zsh z innymi powłokami. Zsh ma lepszą obsługę trybu vi.


2
Jak działa tryb vi w Zsh? Jestem użytkownikiem bash i mam włączony tryb vi, więc chciałbym wiedzieć, czy zmiana ma jakąkolwiek korzyść.
ptman

1
@ptman: można ustawić monit zsh o podanie trybu (insert / normal). Readline nie może tego zrobić. Podpowiedź jest również bardziej elastyczna: możesz wyróżniać składnię itp.
unperson325680

@progo: ahh! bardzo dobrze. Teraz po prostu może zacząć używać trybu VI zsh. To był jeden z moich powodów, dla których dotychczas trzymałem się trybu emacs.
iconoclast

@Brandon to niewielkie ulepszenie było powodem, dla którego zmieniłem powłoki.
unperson325680,

-1

Bash używa tej samej składni dla if i while, która może być użyta w skryptach / bin / sh w linii poleceń.
W obrębie Zsh składnia jest inna. Aby skutecznie korzystać z zsh, musisz pamiętać o obu, jeśli używasz instrukcji if lub while w linii poleceń


1
Próbowałem tego, używając if [[ $test = "test" ]]; then echo "success"; else echo "failure"; fizarówno wiersza polecenia, jak i skryptu, i działało zgodnie z oczekiwaniami w obu przypadkach. Wygląda na to, że nie masz jasnych faktów.
iconoclast

Zależy to od tego, co zainstalowałeś jako / bin / sh. Jeśli / bin / sh to bash, masz rację. W przeciwnym razie bash nie ma tej przewagi. Jeśli zsh to / bin / sh, zsh ma tę zaletę. Biorąc pod uwagę wszystkie różne powłoki, które mogą zapewnić / bin / sh, osobiście polecam po prostu użycie powłoki, którą chcesz skrypty powłoki, aby jej brak wskazywał na problem z oczywistą poprawką, a nie na dziwne zachowania bez pojęcia, jak rozwiązać.
Ed Grimm
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.