Observe que Ctrl-Alt-E in bash
não apenas expande aliases. Também expande variáveis, substituição de comando (!), Substituição de processo (!), Expansão aritmética e remove aspas (não gera geração de nome de arquivo (globbing) ou expansão de til).
Nem sempre consegue expandir aliases. Portanto, embora tenha seus usos, é importante perceber que seu resultado potencialmente altera o significado da linha de comando, tem efeitos colaterais e é potencialmente perigoso.
Por exemplo, em:
$ a=';w' b=1
$ alias foo=bar
$ b=2; echo $b $a; cd /tmp/dir && for i do foo $(pwd) <(ls); done
Se eu pressionar M-C-E
aqui, isso me dá:
$ b=2; echo 1 ;w; cd /tmp/dir && for i do foo / /dev/fd/63; done
O que me dá uma linha de comando completamente diferente (e imagine o que teria acontecido se eu tivesse tido em rm -rf *
vez de pwd
acima) e não expande o foo
alias.
Com zsh
, para aumentar a nota de Gilles sobre aliases expandidos dentro de funções, você pode:
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
Isso expandirá os aliases apenas se a linha de comando atual for sintaticamente válida (portanto, ela também funciona como um verificador de sintaxe).
Ao contrário bash
do MCE, ele também resolve completamente os aliases. Por exemplo, se você tiver:
$ alias ll='ls -l'; alias ls='ls --color'
$ ll
Será expandido para:
$ ls --color -l
Observe que ele também canoniza a sintaxe para coisas como:
$ for i (*) cmd $i; foo
será alterado para:
$ for i in *
do
cmd $i
done
foo
C-x a
expande o alias sob o cursor (supondo que você esteja usando o sistema de conclusão).