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
встроенной.