Si noti che Ctrl-Alt-E in bash
non espande solo gli alias. Espande anche le variabili, la sostituzione dei comandi (!), La sostituzione dei processi (!), L'espansione aritmetica e rimuove le virgolette (non genera la generazione del nome del file (globbing) o l'espansione della tilde).
Non sempre riesce a espandere gli alias. Quindi, sebbene abbia i suoi usi, è importante rendersi conto che i suoi risultati cambiano potenzialmente il significato della riga di comando, hanno effetti collaterali ed è potenzialmente pericoloso.
Ad esempio in:
$ a=';w' b=1
$ alias foo=bar
$ b=2; echo $b $a; cd /tmp/dir && for i do foo $(pwd) <(ls); done
Se premo M-C-E
qui, mi dà:
$ b=2; echo 1 ;w; cd /tmp/dir && for i do foo / /dev/fd/63; done
Il che mi dà una linea di comando completamente diversa (e immagina cosa sarebbe successo se avessi avuto rm -rf *
invece di pwd
sopra) e non espande l' foo
alias.
Con zsh
, per costruire sulla nota di Gilles sugli alias espansi all'interno delle funzioni, potresti fare:
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
Ciò espanderà gli alias solo se la riga di comando corrente è sintatticamente valida (quindi funge anche da correttore di sintassi).
Contrariamente al bash
MCE, risolve anche completamente gli alias. Ad esempio se hai:
$ alias ll='ls -l'; alias ls='ls --color'
$ ll
Sarà esteso a:
$ ls --color -l
Nota che canonicalizza anche la sintassi, quindi cose come:
$ for i (*) cmd $i; foo
sarà cambiato in:
$ for i in *
do
cmd $i
done
foo
C-x a
espande l'alias sotto il cursore (supponendo che tu stia utilizzando il sistema di completamento).