zsh: 재귀는 어디에서 오는가

zsh: 재귀는 어디에서 오는가

.zshrcI가 다음을 가지고 있다고 가정합니다.

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

예상대로 합계가 whence ls반환됩니다 ls --color=auto.whence llls -halF

옵션( help whence도움말에는 아무것도 없음)이나 <rwhence> ll생성할 수 있는 줄 ls --color=auto -halF이 있습니까?

답변1

먼저, 일반 구성에서 사용할 때 별칭이 실제로 반복되는 것을 확인했습니다.

% PS1='%% ' zsh -f
% alias echo='echo foo'
% echo mlatu
foo mlatu
% alias xxxx='echo bar'
% xxxx gerku
foo bar gerku
% 

물론. whencein 옵션을 조사한 결과 zshall(1)재귀 수행에 대한 옵션이 나타나지 않았으므로 뭔가를 작성해 보겠습니다.

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
}

기본적으로 출력을 구문 분석하고 whence -v별칭 정의를 찾은 다음, 그렇다면 첫 번째 명령 단어를 가져오거나, 이미 보고 있는 내용이 아닌 경우 반복합니다. 저는 전혀 사용하지 않는 전역 별칭에 대한 지원이 더 복잡합니다.

% 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
% 

답변2

함수 정의에서 별칭이 확장된다는 사실을 활용할 수 있습니다.

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

그 다음에:

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

(물론 그걸 실행해확장하다별칭 확장을 비활성화하지 않는 한 별칭 지정은 실행과 동일하지 않습니다 a.

관련 정보