Observe que Ctrl-Alt-E em bash
não apenas expande os aliases. Também expande variáveis, substituição de comandos (!), Substituição de processos (!), Expansão aritmética e remoção de cotações (não faz geração de nome de arquivo (globbing) ou expansão de til).
Nem sempre consegue expandir os aliases. Assim, 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 dará:
$ b=2; echo 1 ;w; cd /tmp/dir && for i do foo / /dev/fd/63; done
O que me dá uma linha de comando totalmente diferente (e imagine o que teria acontecido se eu tivesse rm -rf *
em vez de pwd
acima) e não expandisse o foo
alias.
Com zsh
, para aumentar a nota de Gilles sobre os aliases expandidos dentro das funções, você poderia:
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 somente se a linha de comando atual for sintaticamente válida (por isso, funciona como um verificador de sintaxe).
Ao contrário do M-C-E de bash
, ele também resolve completamente os aliases. Por exemplo, se você tem:
$ alias ll='ls -l'; alias ls='ls --color'
$ ll
será expandido para:
$ ls --color -l
Note que também canoniza a sintaxe para coisas como:
$ for i (*) cmd $i; foo
será alterado para:
$ for i in *
do
cmd $i
done
foo