Beachten Sie, dass Strg-Alt-E in bashnicht 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:
$ a=';w' b=1
$ alias foo=bar
$ b=2; echo $b $a; cd /tmp/dir && for i do foo $(pwd) <(ls); done
Wenn ich M-C-Ehier drücke , gibt mir das:
$ b=2; echo 1 ;w; cd /tmp/dir && for i do foo / /dev/fd/63; done
Das gibt mir eine völlig andere Kommandozeile (und stellen Sie sich vor, was passiert wäre, wenn ich rm -rf *statt pwdoben hätte) und erweitert den fooAlias nicht.
Mit zsh, zum Aufbau auf Gilles' Hinweis auf Aliase innerhalb von Funktionen erweitert, könnten Sie tun:
expand-aliases() {
unset 'functions[_expand-aliases]'
functions[_expand-aliases]=$BUFFER
(($+functions[_expand-aliases])) &&
BUFFER=${functions[_expand-aliases]#$'\t'} &&
CURSOR=$#BUFFER
}
zle -N expand-aliases
bindkey '\e^E' expand-aliases
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 bashMCE werden auch die Aliase vollständig aufgelöst. Zum Beispiel, wenn Sie:
$ alias ll='ls -l'; alias ls='ls --color'
$ ll
Wird erweitert auf:
$ ls --color -l
Beachten Sie, dass es auch die Syntax kanonisiert, so dass Dinge wie:
$ for i (*) cmd $i; foo
wird geändert in:
$ for i in *
do
cmd $i
done
foo
C-x aErweitert den Alias unter dem Cursor (vorausgesetzt, Sie verwenden das Vervollständigungssystem).