zsh: recursivo de onde

1

Digamos que no meu .zshrc eu tenha:

alias ls='ls --color=auto'
alias ll='ls -halF'

Como esperado, whence ls retorna ls --color=auto e whence ll retorna ls -halF .

Existe alguma opção (nada em help whence ajudou) ou uma linha única tal que <rwhence> ll produzirá ls --color=auto -halF , ou similar?

    
por nivk 12.11.2017 / 03:53

2 respostas

0

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
% 
    
por 12.11.2017 / 18:28
0

Você pode usar o fato de os aliases serem expandidos na definição da função:

expand_alias() {
  functions[_alias_]=$1
  print -r -- ${functions[_alias_]}
}

Então:

$ alias 'a=a;b'
$ alias 'b=b;a x'
$ alias -g 'x=foo'
$ expand_alias a
    a
    b
    a foo

(obviamente, executar esse alias expandido não é o mesmo que executar a , a menos que você desative a expansão de alias).

    
por 14.11.2017 / 22:28

Tags