Einzigartige Eigenschaften von bash im Vergleich zu zsh


67

Ich bin seit einiger Zeit ein zsh-Benutzer (vor diesem tcsh und vor diesem csh). Ich bin ziemlich zufrieden damit, habe mich aber gefragt, ob es überzeugende Merkmale von bash gibt, die es in zsh nicht gibt. Und umgekehrt gibt es zsh-Features, die es in bash nicht gibt. Mein aktuelles Gefühl ist, dass bash besser ist:

  • Wenn Sie damit bereits vertraut sind und keine neue Syntax erlernen möchten.
  • Es wird standardmäßig auf den meisten * nix-Computern vorhanden sein, während zsh eine zusätzliche Installation sein kann.

Ich versuche hier nicht, einen religiösen Kampf zu beginnen, deshalb suche ich nur nach Merkmalen, die nur in einer der Muscheln existieren.


10
Wie sind Merkmale, die für das eine oder andere subjektive Merkmal einzigartig sind? Ich bin ehrlich gesagt nicht auf der Suche nach einem Flammenkrieg und gehe davon aus, dass die Vertrautheit des einen oder anderen wahrscheinlich ein guter Grund ist, diese Hülle zu bevorzugen.
Tim

Antworten:


40

zsh ist für Vulkanier. ;-)

Im Ernst: Bash 4.0 hat einige Funktionen, die bisher nur in zsh zu finden waren, wie ** globbing:

% ls /usr/src/**/Makefile

ist äquivalent zu:

% find /usr/src -name "Makefile"

aber offensichtlich mächtiger.

Nach meiner Erfahrung ist die programmierbare Vervollständigung von bash zumindest in einigen Fällen ein bisschen besser als die von zsh (z. B. das Vervollständigen von Debian-Paketen für aptitude).

Bash muss Alt + .einfügen!$

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
In bash C-M-ezu "shell-expand-line", was in meinem Fall cat `echo blubb | sed 's/u/a/'` zu cat blabbund echo $SHELLnach expandieren würde echo /bin/bash. Auch C-x *zu "glob-expand-word", das sich erweitern würde rm *.
Victor

16

Ich möchte darauf hinweisen, dass bash nicht standardmäßig unter FreeBSD, OpenBSD oder NetBSD installiert ist und dass es auch nicht standardmäßig unter Solaris 10 (OpenSolaris hat es als Standard) installiert ist, als ich das letzte Mal AIX und oder verwendet habe HP-UX-Server wurden ebenfalls nicht standardmäßig installiert.

Auch unter OpenSolaris ist / bin / sh NICHT bash. Es ist ksh. Das größte Problem, das ich als Software-Portierer habe, sind Leute, die annehmen, dass / bin / sh bash ist und die erweiterte bash-Syntax akzeptiert. Während dies bei den meisten Linux-Distributionen der Fall zu sein scheint, ist es anderswo nicht der Fall und es ist wirklich ärgerlich.


6
Ja, du hast recht. Leider machen es all diese Anbieter sehr einfach, bash als zusätzliches Paket zu installieren. +1, um auf die Notwendigkeit von / bin / sh-Purismus in Skripten hinzuweisen.
Kubanczyk

@kubanczyk: Wenn Sie auf Rechnern arbeiten, auf die Sie keinen Root-Zugriff haben, ist die Installation möglicherweise nicht so einfach, und ich denke, X-Istences Standpunkt steht fest. (Ich arbeite an einer Reihe von Solaris-Boxen, und die Sysadmins sind alle ksh-Junkies. Das letzte Mal, als ich versuchte, meine eigene Software zu kompilieren, ohne die ich nicht leben konnte (in diesem Fall git), gab es auch Mängel mit dem installierten Compiler Diese Route wurde mir abgeschnitten.)
Iconoclast

12

Obwohl ich ein Bash-Benutzer bin, finde ich eine der Funktionen von zsh ziemlich cool: RPS1.

Merken:

  • PS1: die linksbündige Eingabeaufforderung
  • RPS1: die rechtsbündige Eingabeaufforderung

Stichprobe:

Bei der Verwendung von etwas wie

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

Sie erhalten Ihre Eingabeaufforderung auf der linken Seite und das aktuelle Verzeichnis auf der rechten Seite. Es verschwindet sogar, wenn die aktuelle Zeile zu lang wird! Dies liegt daran, dass zsh intelligent genug ist, um RPS1 eine niedrige Priorität einzuräumen.

Ein Screenshot dieses Beispiels finden Sie unter http://imgur.com/OAZhC .


9

Zsh hat Rechtschreibkorrektur. Wenn Sie einen Brief (oder mehr) verfehlen, wird er herausfinden, was Sie damit gemeint haben.

Es hat auch robustere Tab-Vervollständigung, die ich mag.

Zsh verfügt über ein interaktives Konfigurationsdienstprogramm, mit dem Sie festlegen können, wie Sie möchten.

Einige Geschwindigkeitstests sagen, dass zsh schneller ist, aber ich habe keinen Unterschied bemerkt.


1
Eine abgespeckte Version von dash, die nur eine Teilmenge ihrer Funktionen unterstützt und für Skripte entwickelt wurde, die schnell ausgeführt werden sollen (z. B. Start-Skripte), ist dash.
Chucky

zshEs gibt sogar eine Einstellung, bei der für die Verwendung mit der Dvorak-Tastatur nur ein einziger Buchstabe verwendet werden kann.
VGOFF

6

Ich kenne keine Bash-Funktionen, die zsh nicht unterstützt. Das Design-Ziel von zsh scheint die Unterstützung aller Features zu beinhalten, die bash hinzufügt.

Ich benutze immer noch bash anstelle von zsh. Ich stoße selten auf überzeugende Funktionen, die zsh nicht unterstützt. Gelegentliche Probleme mit zsh im Laufe der Jahre oder auf bestimmten Systemen nicht vorhandene Probleme haben den Übergang nicht wert gemacht.

Endlich kann ich auf jedem Unix-System dieselbe Shell verwenden. Es lohnt sich nicht, diese für Funktionen zu brechen, die ich nie verwenden werde.

Die in zsh enthaltenen Funktionen, die nicht in bash enthalten sind, scheinen meistens niedlich zu sein, aber nicht diejenigen, die im Alltag eine Rolle spielen würden.


3

bash hat viele Funktionen, die früher nur in zsh verfügbar waren. Wie jeder Ubuntu-Benutzer in letzter Zeit festgestellt hat, können Sie jetzt auch mit Bash die 'Smart Tab-Vervollständigung' durchführen.


1

Prozessersetzung und erweitertes Globbing sind die beiden Funktionen, die ich am meisten vermissen würde. Die Einstellungen für die Eingabeaufforderung sind auch ziemlich cool. Sie sehen die Verschachtelungsebene, wenn Sie komplexe Anweisungen in die Befehlszeile eingeben. Durch Autoloading ist es möglich, viele Funktionen in jede Shell aufzunehmen.


Ich nehme an, du meinst, du würdest die von zsh vermissen, da AFAIK alles, was du erwähnt hast, in zsh beinhaltet? (Aber sind Sie sicher, dass sie alle nicht an der Bash teilnehmen? Das würde mich überraschen.) Zumindest würde das Ihre Antwort klarer machen, da auf beiden Seiten des Bash / Zsh-Zauns Menschen antworten. Es wäre auch hilfreich, wenn Sie Beispiele dafür nennen würden, wie jede dieser Funktionen Ihr Shell-Leben erleichtert.
Iconoclast

0

Ich bin ein Fan von zsh, weil der vi-Modus unterstützt wird, aber ich stelle fest, dass er nicht sehr verbreitet ist. Ich glaube, ich habe gelesen, dass zsh gern beliebte Features aus den anderen Shells nimmt und kombiniert (also sind sowohl für bash als auch für csh spezifische Dinge in zsh verfügbar).

Jemand sagte auch, dass ich meinen Geek-Faktor mit zsh biege, aber ich kann dieses Gerücht nicht bestätigen oder leugnen.


5
und ja, bash unterstützt auch vi-mode.
pjz

@Milner: Kannst du erklären, welche Art von vi-Modus-Unterstützung in zsh vorhanden ist, die nicht in bash enthalten ist? Wenn Sie einfach die Möglichkeit meinen, set -o vi in ​​der Befehlszeile auszuführen, dann ist das in beiden Fällen eindeutig. Wenn es in zsh eine erweiterte Unterstützung gibt, können Sie klar beschreiben, was es ist und was es hinzufügt?
Iconoclast

-1

Popularität, #bash 430 Benutzer. #zsh 123 Benutzer. Ich glaube, die zsh-Website bietet einen guten Vergleich von zsh mit anderen Shells. zsh unterstützt den vi-Modus besser.


2
Wie ist der vi-mode in zsh besser? Ich bin ein Bash-Benutzer und habe den Vi-Modus aktiviert. Daher möchte ich wissen, ob das Umschalten Vorteile bringt.
ptman

1
@ptman: zshs Eingabeaufforderung kann veranlasst werden, den Modus mitzuteilen (Einfügen / Normal). Readline kann das nicht. Auch die Eingabeaufforderung ist flexibler: Sie können Syntax-Hervorhebungen usw. vornehmen!
unperson325680

@progo: ahh! Sehr schön. Jetzt könnte ich einfach anfangen, den vi-Modus in zsh zu verwenden. Das war einer meiner Gründe, bisher im Emacs-Modus zu bleiben.
Bilderstürmer

@Brandon diese kleine Verbesserung war der Grund für mich, Muscheln zu wechseln.
unperson325680

-1

Bash verwendet die gleiche Syntax für if und while, wie sie in / bin / sh-Skripten in der Befehlszeile verwendet werden kann.
Innerhalb von zsh unterscheidet sich die Syntax. Wenn Sie zsh verwenden, müssen Sie sich beides merken, wenn Sie eine if- oder while-Anweisung in Ihrer Befehlszeile verwenden


1
Ich habe dies versucht, indem ich if [[ $test = "test" ]]; then echo "success"; else echo "failure"; fisowohl die Befehlszeile als auch ein Skript verwendet habe, und es hat in beiden Fällen wie erwartet funktioniert. Es sieht also so aus, als hätten Sie Ihre Fakten nicht klar.
Iconoclast

Dies hängt davon ab, was Sie als / bin / sh installiert haben. Wenn / bin / sh bash ist, dann hast du recht. Ansonsten hat bash diesen Vorteil nicht. Wenn zsh / bin / sh ist, hat zsh diesen Vorteil. Angesichts all der verschiedenen Shells, die / bin / sh bereitstellen könnten, empfehle ich persönlich, nur die gewünschte Shell für die Skripterstellung zu verwenden, damit deren Fehlen auf ein Problem mit einer offensichtlichen Korrektur hinweist, anstatt auf bizarres Verhalten ohne Ahnung, wie es gehandhabt werden soll Entschlossenheit.
Ed Grimm
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.