1

когда я писал сценарий оболочки, я узнал, что command - это зарезервированное слово. Тогда я заметил, что command также является командой bash.

  • command ls дает тот же результат, что и ls .
  • command ls | grep xxx дает тот же результат, что и без него.

Тогда мне интересно, для чего он используется, когда это команда bash. И для чего он используется, когда он находится в сценарии оболочки. Спасибо!

1 ответ1

2

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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .