为什么 zsh 预命令修饰符在引用时停止接受参数?

为什么 zsh 预命令修饰符在引用时停止接受参数?

zsh具有命令前修饰符,位于命令之前以改变命令的解释方式。其中一些是commandexec

$ 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

听起来像是引用它们使它们立即运行而不处理其他参数。

它使得阻止别名命名commandexec扩展是不可能的。

这是一个错误还是一个功能?它记录在某处吗?

答案1

Zsh 以与别名和关键字相同的方式解析命令前修饰符:它们必须位于命令的开头,不带引号。这对于影响命令 ( noglob, nocorrect) 解析的修饰符来说非常必要。预命令修饰符builtin, command,exec在内部使用相同的逻辑,即使它们可以以其他方式解释。

据我所知,这种逻辑没有什么深层次的原因,只是几十年前就这样做了,没有人足够关心这个边缘情况来解决它。

鉴于类似的事情\command -v ls没有做任何明智的事情,这绝对是一个错误。

相关内容