для чего используется команда bash `command` и что это такое, когда она появляется в сценарии оболочки

391
Tiina

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

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

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

1

1 ответ на вопрос

2
Kamil Maciorowski

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

Похожие вопросы