command foo
запустит команду foo
даже если определена функция оболочки foo
. Это поведение требуется POSIX .
Это позволяет вам вызывать команду foo
внутри функции foo
. Без command foo
функция (при вызове) будет вызывать сама себя и создавать циклическую ссылку.
Ну, иногда вы можете вызвать исполняемый файл foo
по его полному пути, чтобы подавить поиск функции оболочки (громоздкий и непереносимый, но все же это своего рода обходной путь), но в некоторых случаях это невозможно. Например, в этом моем ответе (ближе к концу) я переопределяю cd
и command cd
обязательна, потому что даже если есть исполняемый файл cd
полный путь которого я могу использовать, он не изменит каталог. Использование command
- верный способ справиться с этим.
Также обратите внимание, что command foo
не будет вызывать псевдоним foo
(если есть). Вы использовали ls
в качестве примера. По крайней мере , несколько общих дистрибутивы Linux псевдонима ls
ls --color=auto
по умолчанию. В этом случае ls
и command ls
могут давать разные результаты (т.е. цветные или нет). POSIX (или любое другое) определение command
не должно упоминать псевдонимы, потому что bar foo
в первую очередь не вызывает псевдоним foo
(если есть) (с несколькими исключениями, касающимися bar
, но command
не является одним из них).
Используете ли вы command foo
в сеансе интерактивной оболочки или в сценарии оболочки, может иметь значение для foo
, но не для встроенной command
.