Unterschied zwischen Alias ​​in zsh und Alias ​​in bash

9

Ich habe mich umgesehen, konnte aber nichts aussagekräftiges finden. Gibt es einen Unterschied zwischen dem Alias-Befehl in zsh und dem Alias-Befehl in bash? Wenn nicht, kann ich dann eine Reihe von Aliasnamen zwischen den beiden Shells teilen und erwarten, dass sie wie beabsichtigt funktionieren?

Zameer Manji
quelle

Antworten:

7

Laut den Zsh Workshop Aliasen scheinen sie die gleiche Syntax zu haben, also sollten sie funktionieren.

Rainer Bendig
quelle
Das kann ich bezeugen. Das tun für mich.
Frogstarr78
13

Die Syntax des aliasBefehls ist in allen Bourne-Shells gleich. So können Sie sie über gemeinsam nutzen können ~/.zshrc, ~/.bashrc, ~/.kshrc, ~/.shrc, solange sie Sinn in allen den Schalen zu machen.

Gleiches gilt für Variablendefinitionen und Funktionsdefinitionen, sofern Sie die Teilmenge der Syntax verwenden, die in allen Shells unterstützt wird.

Wenn Sie keine Versionen von zsh verwenden, die älter als 4.0 sind, können Sie alle Ihre Shell-agnostischen Definitionen in einer Datei namens (sagen wir) ablegen ~/.common.rc.sh, in der sich die erste Zeile befindet

emulate -LR sh 2>/dev/null

Dies weist zsh an, nur in dieser Datei eine sh-kompatible Syntax zu erwarten. Dann Quelle der Datei am Anfang der ~/.bashrc, ~/.bashrc, ~/.kshrcund so weiter.

Das ist im Grunde das, was ich tue. Zum Beispiel, ich habe etwas komplexen Code, der einen Alias für generiert lsmit meinen Lieblings - Optionen , je nachdem , was verfügbar ist ( --color, -G, -F, etc.); Es ist muschelunabhängig, also geht es rein .common.rc.sh. Ich habe auch Shell-abhängige Aliase, so alias zcp='zmv -C'geht das rein .zshrc.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Wenn ich einen /bin/shShebang oben in meine Aliase-Datei setze , funktioniert er dann so, wie ich es für alle Shells beabsichtige?
Zameer Manji
1
@ZameerManji Nein, setzen Sie keine #!Zeile: Dies ist kein eigenständiges Skript, es kann nur in einem anderen Skript bezogen werden. #!ändert das Verhalten der Shell sowieso nicht.
Gilles 'SO - hör auf böse zu sein'
3
Ein winziger Unterschied, den ich gefunden habe, ist, dass zsh's aliasein Argument, das mit +der Einführung einer Option beginnt, wie -würde, also alias +=somethingwie alias -- +=somethingin zsh geschrieben werden muss . Denken Sie nicht, dass sich das emulateändert.
Mikel
Seien Sie vorsichtig, ~/.shrcda die Bourne Shell über die leistungsstärkste Alias-Implementierung verfügt, jedoch zshinkompatible Optionsnamen verwendet. alias -gErstellt einen dauerhaften Alias ​​in $HOME/.globalsder Bourne Shell. Das Teilen von Aliasdefinitionen ist nur sicher, solange Sie nicht mehr als die POSIX-Funktionen verwenden.
schily
2

zsh's aliaserlaubt globale Aliase, während bashs nur am Zeilenanfang erweitert werden.

In zsh:

alias -g L="| less -FRX"

Sie können dann tun:

verbose-command L

Siehe hier für eine Liste von hilfreichen globalen Aliase.

Tom Hale
quelle
Der Aufruf alle Aliase erweitern „global“ Aliase ist eine wirklich schlechte Idee , da es ein Konzept ist lokalen Aliase , die in ein bestimmtes Verzeichnis beschränkt werden , während globale Aliase seit 38 Jahre auf Aliase anwenden , die diectory unabhängig sind. Dieses Konzept stammt aus dem Jahr 1980 von UNOS und ist seit 6 Jahren in der Bourne Shell implementiert. UNOS führte 1980 auch alle Erweiterungs-Aliase ein. Zsh hätte einige Untersuchungen durchführen können, um diese Art von Zusammenstoß zu vermeiden. Siehe schillix.sourceforge.net/man/man1/bosh.1.html
schily