나는 생각 중입니다:
function noalias() {
setopt localoptions noexpandalias
"$@"
}
하지만 마지막 줄이 무엇인지 모르겠습니다. eval "${*:q}"
? eval "$@"
? eval "${@:q}"
? "${@:q}"
? ${@:q}
? $@
? (그 차이점을 설명해 주실 수 있나요?)
답변1
별칭은 기능 실행은 물론이고 간단한 명령을 이해하기 전인 매우 초기 단계에서 확장되므로 작동하지 않습니다.
명령줄을 읽고 구문 분석하려면 먼저 옵션 noaliases
( expandalias
예 옵션)을 적용해야 합니다 bash
.
그러나 일반 별칭, 즉 정의를 사용하여 명령 위치에서 확장된 별칭만 비활성화하려면 alias foo=bar
다음을 수행하십시오.
noalias() "$@"
충분합니다. 왜냐하면 alias가 있으면 cmd
다음에서 확장되지 않기 때문입니다.
noalias cmd args
왜냐하면 cmd
그는 지휘권을 갖고 있는 위치에 있지 않기 때문이다.
작동하지 않습니다글로벌alias -g
별칭( 예를 들어 alias -g args=foo
쉘을 확장하기 위해 로 설정된 별칭)단어명령 위치에 있는지 여부에 관계없이).
그렇게 하더라도:
noalias() {
setopt localoptions noaliases
eval "$@"
}
다음을 사용하여 명령을 호출하십시오.
noalias 'cmd args'
예를 들면 다음과 같습니다.
alias -g "'cmd arg'=gotcha"
또는
alias -g noalias=gotcha
너는 달려야 해
set +o expandalias
명령을 읽기 전에. 그러나 이를 수행하기 위해 키 바인딩을 사용할 수 있습니다.
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
Alt그런 다음 + Shift+를 눌러 A전환합니다.