Primeiramente, confirmamos que os aliases realmente são recursivos quando usados em uma configuração sã ...
% PS1='%% ' zsh -f
% alias echo='echo foo'
% echo mlatu
foo mlatu
% alias xxxx='echo bar'
% xxxx gerku
foo bar gerku
%
Realmente eles fazem. Um estudo das opções para whence
em zshall(1)
não revela nenhuma opção que faça a recursão, então vamos tentar escrever algo.
function rwhence {
local def
local -a alias
def=$(builtin whence -v $1)
print $def
if [[ $def == *'is an alias for'* ]]; then
# simplification: assume global aliases do not exist
alias=( ${(z)def##*is an alias for } )
# loop detection only at the immediate level
if [[ $alias[1] != $1 ]]; then
rwhence $alias[1]
fi
fi
}
Basicamente, analisamos a saída de whence -v
, procuramos por uma definição de alias e, em caso afirmativo, extraímos a primeira palavra de comando e, se isso não é o que já estamos vendo, recurse. Os aliases globais (que eu nunca uso) seriam mais complicados de suportar.
% rwhence xxxx
xxxx is an alias for echo bar
echo is an alias for echo foo
% rwhence echo
echo is an alias for echo foo
% rwhence cat
cat is /bin/cat
% rwhence mlatu
mlatu not found
%