Почему параметры `command` и `type` в Bash являются необязательными?

Почему параметры `command` и `type` в Bash являются необязательными?

Похожий наПочему параметры встроенной функции 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, вы получите команду оболочки, которая ничего не делает (но все равно выполняет перенаправления). Странно, но с 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). Наличие нулевых аргументов является естественным продолжением этого поведения.

Связанный контент