为什么 Bash 的“command”和“type”参数是可选的?

为什么 Bash 的“command”和“type”参数是可选的?

如同为什么 Bash 的内置参数是可选的?,如果未提供参数,这些命令不打印任何内容并返回退出代码 0。但不同的是builtin,他们的help输出表明至少有一个参数是强制的。这是一个错误,一个功能,还是我误解了什么?

$ bash --version
GNU bash, version 4.2.10(1)-release (x86_64-pc-linux-gnu)
$ type -a command
command is a shell builtin
$ type -a type
type is a shell builtin
$ help -s command
command: command [-pVv] command [arg ...]
$ help -s type
type: type [-afptP] name [name ...]
$ command
$ echo $?
0
$ type
$ echo $?
0

答案1

POSIX 认为命令参数是必需的。所以这可能是一个错误。

POSIX 2008 命令规范

答案2

对于command,直接的解释可能是 ksh 做了同样的事情(至少 ATT ksh93、pdksh 和 mksh 在command不带参数运行时不执行任何操作,我没有 ATT ksh88 来测试)。

我不知道为什么 ksh 会这样。一个初步的解释是,这command foo很像foo,如果您省略foo,您会得到一个不执行任何操作(但仍执行重定向)的 shell 命令。奇怪的是,使用 ksh 93s+ 2008-01-31(但不使用 pdksh、mksh、bash、ash 或 zsh)时,ksh -c 'foo=bar command; echo $foo'显示bar,这意味着该赋值被视为 shell 变量赋值,而不是命令本地环境赋值。此行为仅适用于特殊的内置实用程序, 哪个command不是(理由解释了为什么不)。这看起来像是 ksh93 中的一个错误。

在 ksh 中,builtin显示内置实用程序的列表,这很有用。

type是一种不同的情况:它接受多个参数,并依次报告每个参数(例如type ls cd)。零参数是这种行为的自然延续。

相关内容