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辞書コマンド修飾子builtincommandexec他の方法で解釈できますが、内部的に同じロジックを使用します。

私が知る限り、この論理の深い理由はありません。これは数十年前にこのように行われており、それを修正するのに十分なこの極端なケースには誰も興味を持っていなかったからです。

似たようなことが\command -v ls合理的なことをしないことを考えると、これは間違いです。

関連情報