zsh 사전 명령 수정자가 인용될 때 인수 허용을 중지하는 이유는 무엇입니까?

zsh 사전 명령 수정자가 인용될 때 인수 허용을 중지하는 이유는 무엇입니까?

zsh명령이 해석되는 방식을 변경하기 위해 명령 앞에 배치되는 사전 명령 수정자가 있습니다. 그들 중 일부는 command및 입니다 exec.

$ zsh -c 'exec -a foo zsh -c "print -- \$0"'
foo
$ zsh -c 'command -v ls'
/bin/ls

그러나 그들은 다음과 같은 주장이 인용되면 더 이상 받아들이지 않습니다.

$ zsh -c '\exec -a foo zsh -c "print -- \$0"'
zsh:1: command not found: -a
$ zsh -c '\command -v ls'
zsh:1: command not found: -v

인용하면 다른 매개변수를 처리하지 않고 즉시 실행되는 것처럼 들립니다.

command별칭 이름 지정 이나 확장을 방지하는 exec것이 불가능합니다 .

이것은 버그입니까 아니면 기능입니까? 어딘가에 문서화되어 있습니까?

답변1

Zsh는 별칭 및 키워드와 동일한 방식으로 사전 명령 수정자를 구문 분석합니다. 이는 따옴표 없이 명령 시작 부분에 있어야 합니다. 이는 명령 구문 분석에 영향을 미치는 수정자 ( noglob, )에 필요합니다. nocorrect사전 명령 수정자 builtin, commandexec다른 방식으로 해석될 수 있더라도 내부적으로 동일한 논리를 사용합니다.

내가 아는 한, 이 논리에 대한 깊은 이유는 없습니다. 단지 수십 년 전에 이런 방식으로 수행되었으며 이를 수정할 만큼 이 극단적인 경우에 대해 아무도 관심을 두지 않았기 때문입니다.

비슷한 일이 \command -v ls합리적인 일을 하지 않는다는 점을 고려하면 이는 확실히 실수입니다.

관련 정보