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