Заказ исполняемых файлов стартовал в bash

Если я выполняю команду test в bash, test (оценивает условное выражение) запускает встроенную утилиту:

 $ type test test is a shell builtin $ type -a test test is a shell builtin test is /usr/local/bin/test test is /usr/bin/test $ 

Однако, как видно на выходе type -a test выше, есть еще один test в каталоге / usr / local / bin и еще один в каталоге / usr / bin. Как упорядочиваются исполняемые файлы, т. Е. Всегда предпочтительны встроенные команды, а остальные команды зависят от порядка каталога в переменной $ PATH? Кроме того, возможно ли изменить порядок запуска исполняемых файлов, например, если я набираю test , то вместо test bash-builtin запускается запуск / usr / bin / test ?

2 Solutions collect form web for “Заказ исполняемых файлов стартовал в bash”

Наивысшим приоритетом является псевдоним bash, затем специальные встроенные функции (только в режиме POSIX), затем функции, затем встроенные функции, затем поиск в $PATH .

Чтобы выполнить встроенный, используйте builtin test .
Чтобы выполнить внешнее приложение, используйте явный путь: /bin/test .
Чтобы игнорировать функции и псевдонимы, используйте command test .
Чтобы обойти просто псевдоним, используйте \test или любой другой вид расширения.

Можно отключить / включить встроенный с enable test .

(Обновлено согласно комментариям ниже)
(Исправлено неверное редактирование admin, что bash disable встроенный – фактически, есть только enable )

Встроенные команды всегда предпочтительны для внешних команд. Обоснованием является то, что встроенная команда работает быстрее (и в некоторых случаях, например, cd или test -o BASH_OPTION , только test -o BASH_OPTION может иметь только встроенную команду).

Иногда внешняя команда может иметь возможности, которые не имеет встроенная оболочка. В этом случае вы можете вызвать внешнюю команду, указав явный путь (т. Е. Содержащий косую черту) (это обходит любую озабоченность порядком в $PATH ). Если вы не хотите жестко закодировать внешний путь, но хотите предотвратить использование встроенного, вы можете использовать "$(type -P test)" (обратите внимание на капитал P ) в bash, "$(whence -p test)" в ksh, и =test в zsh. Другой способ принудительного использования внешней команды – использовать command builtin ( command -p test … ) или пройти через утилиту env test … ( env test … ).

В zsh вы можете отключить встроенный disable test . Это постоянный (для текущей оболочки или подоболочки), пока встроенный не будет повторно enable test с enable test . В bash вы можете сделать то же самое, enable -n test чтобы отключить и enable test для повторного использования.

Вы можете использовать псевдоним или функцию для принудительного выполнения другой команды, например, alias test=/usr/bin/test или test () { /usr/bin/test "$@"; } test () { /usr/bin/test "$@"; } . Если у вас есть такой псевдоним, вы можете предотвратить его использование, указав любую его часть, например, \test выполнит обычную функцию / встроенный / внешний поиск. Обратите внимание, что в зависимости от оболочки и ее параметров, определения псевдонима в функции могут быть расширены при чтении функции или при ее выполнении. Если вы определили функцию, вы можете использовать command test чтобы предотвратить поиск функции, а также поиск псевдонима (так что здесь будет вызываться встроенное test , если оно не отключено).

  • Возможно одновременное использование скобок (перестановки) и расширения массива?
  • Команда, которая дает имя пользователя @ hostname: pwd
  • Почему встроенные времена не работают в трубопроводе?
  • Сделать bash использовать внешнюю команду `time`, а не встроенную оболочку
  • Почему printh bash быстрее, чем / usr / bin / printf?
  • встроенный возврат
  • Как конкретно запускать встроенную команду оболочки
  • В чем разница между тем, где и где
  • Записывать вывод `time` в файл, зачем нужны скобки?
  • Почему руководство для команды «где» недоступно
  • Команда типа не может различать исполняемую команду и сценарий оболочки
  • Linux и Unix - лучшая ОС в мире.