為什麼 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)。零參數是這種行為的自然延續。

相關內容