Bash の `command` と `type` へのパラメータがオプションなのはなぜですか?

Bash の `command` と `type` へのパラメータがオプションなのはなぜですか?

に似ているBash の組み込みパラメータがオプションなのはなぜですか?では、これらのコマンドは何も出力せず、パラメータが指定されていない場合は終了コード0を返します。しかし、とは異なりbuiltinhelp出力は次のようになります。少なくとも1つのパラメータは必須ですこれはバグでしょうか、それとも機能でしょうか、それとも私が何かを誤解したのでしょうか?

$ 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、何もしないシェルコマンド (ただしリダイレクトは実行) になるということです。奇妙なことに、ksh 93s+ 2008-01-31 では (pdksh、mksh、bash、ash、zsh ではそうではありません) はksh -c 'foo=bar command; echo $foo'を表示しますbar。これは、代入がコマンドローカル環境の代入ではなく、シェル変数の代入として扱われることを意味します。この動作は、特別な組み込みユーティリティ、 どれのcommandそうではありません (その理由は理論的根拠で説明されています)。これは ksh93 のバグのようです。

ksh では、builtin組み込みユーティリティのリストが表示されます。これは便利です。

typeは別のケースです。複数の引数を受け入れ、それぞれについて順番に報告します (例: type ls cd)。引数が 0 の場合も、この動作の自然な継続です。

関連情報