내 .zshrc
I가 다음을 가지고 있다고 가정합니다.
alias ls='ls --color=auto'
alias ll='ls -halF'
예상대로 합계가 whence ls
반환됩니다 ls --color=auto
.whence ll
ls -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
%
물론. whence
in 옵션을 조사한 결과 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
.