Welche Funktionen sind in zsh enthalten und fehlen in bash oder umgekehrt?

62

Als Linux-Benutzer habe ich immer nur bash verwendet, da dies die Standardeinstellung für jede von mir verwendete Distribution war. Menschen, die andere Unix-Systeme wie BSD verwenden, scheinen weitaus häufiger andere Shells zu verwenden. Um ein bisschen mehr zu lernen, habe ich beschlossen, zsh auszuprobieren.

Als bash Benutzer:

  • Welche Features werde ich vermissen?
  • Und auf welche sollte ich achten?
Macha
quelle
5
@Gilles eines Tages könnte es schön sein, wenn alle hierher gezogen sind ... und zusammengeführt werden
Xenoterracide

Antworten:

45

Auf anderen Stack Exchange-Sites gab es bereits einige Aktivitäten zu diesem Thema. Soweit ich mich erinnern kann (es war vor Jahren²), habe ich beim Umstieg von bash auf zsh keine einzige Sache verpasst. Ich habe viel gewonnen; Ich denke, hier sind die einfachen zsh-spezifischen Funktionen, die ich am häufigsten verwende:

  • Die zsh-Funktion, die ich am meisten vermisse, wenn ich gelegentlich bash verwende, ist autocd: Wenn Sie in zsh ein Verzeichnis ausführen, müssen Sie zu diesem wechseln, sofern Sie die autocdOption aktivieren

  • Ein weiteres sehr nützliches Feature ist das ausgefallene Globbing. Die Hieroglyphen sind etwas schwer zu merken, aber äußerst praktisch (da es oft schneller ist, sie nachzuschlagen, als den entsprechenden findBefehl zu schreiben ). Ein paar der einfacheren Beispiele:
        foo*~*.bak= alle Übereinstimmungen foo*außer denen, die übereinstimmen *.bak
        foo*(.)= nur reguläre Dateien foo*
        foo*(/)= nur Verzeichnisse, die übereinstimmen foo*
        foo*(-@)= nur baumelnde symbolische Links, die übereinstimmen foo*
        foo*(om[1,10])= die 10 neuesten Dateien, die übereinstimmen foo*
        foo*(Lm+1)= nur Dateien mit einer Größe von> 1 MB = im Verzeichnis und all seinen Unterverzeichnisse, rekursiv⁴
        dir/**/foo*foo*dir

  • Für ausgefallene Umbenennungen kann das zmveingebaute nützlich sein. Zum Beispiel, um alle filezu kopieren file.bak:zmv -C '(*)(#q.)' '$1.bak'

  • Sowohl bash als auch zsh haben ein anständiges Vervollständigungssystem, das explizit aktiviert werden muss ( . /etc/bash_completionoder autoload -U compinit; compinit). Zsh ist viel konfigurierbarer und generell schicker.

Wenn Sie zsh ohne a ausführen .zshrc, wird ein interaktives Menü gestartet, in dem Sie Konfigurationsoptionen auswählen können. (Einige Distributionen deaktivieren dies möglicherweise; in diesem Fall führen Sie es aus autoload zsh-newuser-install; zsh-newuser-install.) Ich empfehle, die empfohlenen Verlaufsoptionen zu aktivieren, die Vervollständigung (im „neuen Stil“) zu aktivieren und die „allgemeinen Shell-Optionen“ außer zu aktivieren beep. Konfigurieren Sie später weitere Optionen, sobald Sie diese entdecken.

² Zu der Zeit war die programmierbare Vervollständigung das Killer-Feature von zsh, aber bash erwarb es bald darauf.
Funktionen, die bash nur in Version 4 erworben hat (daher auf vielen Systemen immer noch nicht verfügbar), sind kleiner.

Gilles 'SO - hör auf böse zu sein'
quelle
5
Bash 4.0 unterstützt jetzt die autocdoben beschriebene Funktion. Aktivieren Sie die Funktion mit dem Befehl shopt -s autocd. Dann funktioniert die Funktion wie von Ihnen beschrieben.
Philluminati
zsh hat auch den eingebauten whereBefehl, nicht zu verwechseln mit dem whichBefehl.
Sildoreth
@EdGrimm Ich denke, GNU und FreeBSD find können alles, was zsh glob-Qualifikatoren können (mit -execeiner Shell für Dinge wie Auswahl mit eund einer Pipeline in Tools wie sortund sedzum Umschreiben mit eund Sortieren). Natürlich viel ausführlicher.
Gilles 'SO - hör auf böse zu sein'
Nachdem ich die Suchmanpage mehr als ein Jahrzehnt lang überprüft und erneut überprüft habe, habe ich wohl aufgehört, wirklich zu suchen. Aber wenn ich vor dem Kommentieren ein letztes Mal überprüft hätte, hätte ich zumindest gesehen, dass die Option -size jetzt Einheiten auf Bytes reduziert.
Ed Grimm
11

Auch die Standard-Tab-Vervollständigung ist besser als bash ... zum Beispiel ...

~/.e.dTAB wird ~/.emacs.d/in zsh erweitert, Bash wird nur piepsen.

ocodo
quelle
es hat nicht geklappt. Welche nicht standardmäßige setoptOption verwenden Sie dafür (falls vorhanden)?
Mir ist aufgefallen, dass ich _-.als Wildcard gesetzt habe. zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' . Siehe stackoverflow.com/q/7906078/311660
ocodo
10

zshMit dieser Option können Sie einen mehrzeiligen Befehl bearbeiten (siehe zsh-Zeileneditor ). Wenn Sie den gleichen Trick ( Ctrl-p) versuchen , ruft bash den letzten Befehl ab.

Pedro Silva
quelle
2
Bash tut dies zumindest ab Version 4.2.37; Es ersetzt Zeilenumbrüche durch Semikolons und gibt Ihnen eine einzelne Zeile zum Bearbeiten.
Keith Thompson
1
Immer noch nicht so schön. (:
SilverWolf
8

Bash bietet die Möglichkeit, Ports über zu öffnen

/dev/tcp/host/port

oder

/dev/udp/host/port

Es ist jedoch in Debian deaktiviert, da es als Hindernis angesehen wird (wenn der Pfad tatsächlich existiert) und außerhalb des Umfangs dessen, was eine Shell tun sollte. Weitere Informationen [Debian-Mailingliste]

Portablejim
quelle
5
zsh hat das ztcp eingebaut, welches mehr Fähigkeiten hat als bashs / ​​dev / tcp, hat aber nicht / dev / udp. Ich würde allerdings lieber socat verwenden.
Stéphane Chazelas
2

Welche - in zsh verbessert

Der whichBefehl in der Bash gibt nur die Position eines Befehls an.

In Zsh whichwerden die Definition von a alias, die Quelle für a functionund die Position eines Befehls angezeigt .

Nehmen wir an, wir hatten einen Shell-Alias:

alias gg='git log'

In Bash, wenn wir fragten: which ggDas Ergebnis wäre ungültig

In Zsh: which gggeben uns ...

gg: aliased to git log

Nehmen wir an, wir hatten eine Shell-Funktion:

hello() {
    echo "Hello World"
}

In Bash, wenn wir fragten: which helloDas Ergebnis wäre ungültig.

In Zsh: which hellogeben uns ...

hello() {
    echo "Hello World"
}
ocodo
quelle
Bash bietet die gleiche Funktionalität über den type(eingebauten) Befehl. Und nur um zu picken: whichist ein externer Befehl, kein eingebauter Bash.
Torkel Bjørnson-Langen
Relevante kanonische Frage: Warum nicht "welche" verwenden? Was ist dann zu verwenden?
Anthony G - Gerechtigkeit für Monica
0

zsh - eine komplette Shell

Es gibt viele, durchlesen zshcontrib(1)kann man zwei Versionen von autoload-fähigen tetrisSpielen (die andere mit ncurses) zshim Wettbewerb mit emacs, der Vollständigkeit halber (wie beschrieben) erkennen.

=

Ich möchte das =Schlüsselwort erwähnen , das zu Irritationen führen kann curl( URLs sind normalerweise enthalten ?var=val; es ist jedoch unsetoptmöglich, denke ich):

  • q file =less( gentoo) löst aufq file $(which less)

= wird auf den vollständigen Pfad des betreffenden Befehls erweitert.

andere Leckereien

andere Dinge sind aus dem Kopf heraus die richtige Eingabeaufforderung RPS1=%d(um sie stilvoll anzuzeigen $PWD), Alt + H( run-helpdh man), Alt + ? ( which-command) varedund zed( autoloadFunktion), Emacs 'Minibuffer-ähnliches Alt + XAusführen von Widgets, ohne sie zu binden, globale Aliase und Suffix-Aliase. Ausgedehntes Verlaufsverfolgung Befehlsausführung Laufzeit, -mund -regexMatcher, Shell - Emulation (z. B. csh, kshmit emulate) und autoload run-helpmit Dateiauszügen für die Einbauten.

Wehklagen

Ich denke, die meisten, wenn nicht alle Funktionen wurden vor langer Zeit implementiert, und beim Durchlesen von Änderungsprotokollen gibt es keine größeren Änderungen und neuen Funktionen, was sehr traurig ist (nichts mehr zu erforschen und zu entdecken).

bashscheint mehr werden verteilt in readline(im Gegensatz zu zleund) gnu historyim Linux - Geist; Zum Beispiel können Readline-Funktionen und Tastenkombinationen global angewendet werden (wie in ~/.inputrcund beibehalten /etc/inputrc), wenn sie nicht durch bash-spezifische überschrieben werden bind.

Fazit

Ich persönlich denke emacs(vor allem aus der Perspektive des (aktuellen?) emacs-noxGeschmacks), die Inspiration für die außergewöhnliche Software zu sein, zshund tmuxhabe sehr gute Arbeit geleistet, um ein Beispiel für eine solche Implementierung zu sein. Für die Menschen, die es zu schätzen wissen (bis zu dem Grad, dass sie es nicht brauchen / abhängig vom XServer). Die Unix-Shell ist leistungsfähig genug und ihre Kontinuität und Konsistenz sind ausreichend für einen ordnungsgemäßen Workflow und die Produktivität (im gesamten Computing).

ocodo
quelle