Ich habe Aliase verschachtelt und möchte sie alle auflösen, bevor der Befehl ausgeführt wird. Wie mache ich das?
Wenn es eine Funktion gibt, die an keine Taste gebunden ist, M-x foobar
ist das auch für mich in Ordnung. Ich kann sogar externen Befehl ( type
, command
, which
, was auch immer). Ich habe alles aus dem Thread probiert Warum nicht "welche" verwenden? Was ist dann zu verwenden? aber nichts funktioniert.
C-x a
Erweitert den Alias unter dem Cursor (vorausgesetzt, Sie verwenden das Vervollständigungssystem)._expand_alias (^Xa): expands the word the cursor is on if it is an alias
. Das ist hilfreich, aber immer noch schade, dass man in bash die ganze Zeile erweitern kann, in zsh nicht._expand_alias
bis sich der Bearbeitungspuffer nicht mehr ändert.Antworten:
Beachten Sie, dass Strg-Alt-E in
bash
nicht nur Aliase erweitert. Es erweitert auch Variablen, Befehlsersetzung (!), Prozessersetzung (!), Arithmetische Erweiterung und entfernt Anführungszeichen (es führt keine Dateinamengenerierung (Globbing) oder Tilde-Erweiterung durch).Es gelingt nicht immer, Aliase zu erweitern. Daher ist es wichtig, zu erkennen, dass das Ergebnis möglicherweise die Bedeutung der Befehlszeile ändert, Nebenwirkungen hat und potenziell gefährlich ist.
Zum Beispiel in:
Wenn ich
M-C-E
hier drücke , gibt mir das:Das gibt mir eine völlig andere Kommandozeile (und stellen Sie sich vor, was passiert wäre, wenn ich
rm -rf *
stattpwd
oben hätte) und erweitert denfoo
Alias nicht.Mit
zsh
, zum Aufbau auf Gilles' Hinweis auf Aliase innerhalb von Funktionen erweitert, könnten Sie tun:Dadurch werden die Aliase nur dann erweitert, wenn die aktuelle Befehlszeile syntaktisch gültig ist (und somit auch als Syntaxprüfprogramm fungiert).
Im Gegensatz zu
bash
MCE werden auch die Aliase vollständig aufgelöst. Zum Beispiel, wenn Sie:Wird erweitert auf:
Beachten Sie, dass es auch die Syntax kanonisiert, so dass Dinge wie:
wird geändert in:
quelle
alias ls='ls --color'
und geben SieC-x a
überls
, die ich erhalten:\ls --color
(so dass der neuels
nicht als Alias falsch interpretiert wird). Aber mit Ihrer versteheexpand-aliases
ichls --color
:, das Ergebnis mehrdeutig zu machen.bash
Äquivalent). Wenn Sie den Befehl danach ausführen, erhalten Sie eine weitere Runde der Aliaserweiterung (wie inbash
). Idealerweise sollten Sie die Aliaserweiterung vorübergehend deaktivieren(){ setopt localoptions noexpandalias; ...; }
. Beachten Sie, dass Sie sagen können, dass das_expand_alias
fehlerhaft ist, und dass es den Alias erweitert, wenn es ausgeführt wird\ls
._expand_alias
auch leicht wiealias 'foo=repeat 3 foo'
oder getäuscht wirdalias ls='ls --color'; alias '\ls=echo fooled'
. Hier gibt es keine perfekte Lösung._expand_alias
aufalias 'foo=repeat 3 foo'
würde ich den fehlenden Backslash als Fehler betrachten. Undalias '\ls=echo fooled'
sollte nicht erlaubt sein; hier ziehe ich bash, die sagt:bash: alias: '\ls': invalid alias name
.bash
. Wenn Sie Aliase mit Backslashes nicht mögen, verwenden Sie sie nicht. Warum sollte die Shell sie dann ablehnen? Während Aliase in csh (woher sie kommen) die Funktionen eines armen Mannes ersetzen, sind sie in Bourne-ähnlichen Shells Hacks, um Tricks auszuführen, die mit Funktionen, einer Form der Makro-Erweiterung, die sich früh in den Shell-Parser einfügt, nicht möglich sind Ich sehe keinen Sinn darin, die Möglichkeiten einzuschränken.Wenn Sie eine Befehlszeile in eine Funktionsdefinition einfügen und dann die Funktion ausdrucken, werden die Aliase erweitert. Sie erhalten auch normalisierte Leerzeichen.
Um all dies in einen interaktiven Befehl umzusetzen, können Sie ein zle-Widget erstellen. Sie können eine Funktion direkt definieren, indem Sie ihren Code in einen Eintrag im
functions
Array einfügen . Sie erhalten den Normalisierungseffekt, wenn Sie zurücklesen.Sie erhalten den gleichen Normalisierungseffekt im
preexec
Hook . Aliase werden auch erweitert, wenn eine Funktion automatisch geladen wird (autoload -U
wird häufig verwendet, um eine Alias-Erweiterung zu vermeiden).Die
_expand_alias
Vervollständigungsfunktion erweitert das Wort unter dem Cursor, wenn es sich um einen Alias handelt. Es verwendet dasaliases
Array . Es ist nicht rekursiv. Sie könnten einen allgemeineren Alias-Expander mithilfe von implementierenaliases
, dies ist jedoch etwas schwierig, da die Ermittlung der Positionen, an denen Aliase erweitert werden, eng mit der Shell-Syntax verbunden ist.quelle
autoload -U
einfach verwendet, weil die zsh-Dokumentation es empfiehlt, aber ich habe nie verstanden, was-U
ich tat, bis ich das gelesen habe :). Auch für alle Interessierten, kann man rufen die _expand_alias direkt wirken , indem Ihr Alias in die Befehlszeile eingeben, Schlagen<Esc>
,x
die Minipuffer zu starten, dann die Eingabe_expand_alias<Enter>
Wenn Sie viele verschachtelte, ausgefallene Aliase haben und nicht sicher sind, was zsh tatsächlich mit ihnen macht und in welcher Reihenfolge Optionen an den Befehl übergeben werden, können Sie zsh immer mit
-x
option starten . Dies gibt Befehle und Argumente aus, sobald sie ausgeführt werden.Beachten Sie jedoch, dass diese Option eher für Debugging-Zwecke gedacht ist, so dass sie unmittelbar nach dem
zsh -x
Aufruf (im Grunde genommen jede einzelne Funktion / jedes Widget / Plug-In Ihrer .zshrc) eine Menge unnötiger Informationen ausgibt. Insbesondere während der Befehlsausführung kann sie auch ausführlich sein wenn du definiert hastpreexec
undprecmd
haken.Ich sollte auch erwähnen, dass es nur die Befehle ausgibt, die zuletzt ausgeführt werden, und getrennte Befehle werden also nachher separat gedruckt
Du wirst sehen
quelle