zsh: 별칭 확장 없이 나머지 줄을 실행하는 접두사 함수

zsh: 별칭 확장 없이 나머지 줄을 실행하는 접두사 함수

나는 생각 중입니다:

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전환합니다.

관련 정보