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
, command
,exec
在内部使用相同的逻辑,即使它们可以以其他方式解释。
据我所知,这种逻辑没有什么深层次的原因,只是几十年前就这样做了,没有人足够关心这个边缘情况来解决它。
鉴于类似的事情\command -v ls
没有做任何明智的事情,这绝对是一个错误。