Os aliases são expandidos em um estágio inicial, antes de um comando simples ser entendido como se uma função fosse executada, o que não funciona.
Você precisa da opção noaliases
( expandalias
é a opção bash
) para estar em vigor antes que a linha de comando seja lida e analisada.
No entanto, se você quiser desabilitar somente aliases normais, são aqueles expandidos na posição de comando definida com alias foo=bar
, fazendo:
noalias() "$@"
é suficiente, porque se houver um alias para cmd
, ele não será expandido em:
noalias cmd args
Porque cmd
não está na posição de comando.
Isso não funcionaria para aliases globais (aqueles definidos com alias -g
, como alias -g args=foo
do que expandir qualquer palavra shell se eles estão na posição de comando ou não).
Mesmo se você fez:
noalias() {
setopt localoptions noaliases
eval "$@"
}
E invoque seu comando com:
noalias 'cmd args'
Isso não seria infalível, por exemplo, depois:
alias -g "'cmd arg'=gotcha"
ou
alias -g noalias=gotcha
Você precisa executar
set +o expandalias
Antes do comando ser lido. Você poderia fazer isso com uma ligação de chave:
toggle-aliases() {
if [[ -o aliases ]]; then
set +o aliases
else
set -o aliases
fi
zle -I
}
zle -N toggle-aliases
bindkey '\eA' toggle-aliases
PS1='[aliases $options[aliases]] '$PS1
Pressione Alt + Deslocamento + A para alternar.