Если я выполняю 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
, тогда запускается / usr / bin / test вместо bash-builtin test
?
bash
shell
command
shell-builtin
Мартин
источник
источник
/usr/bin/test -f "$file"
...Ответы:
Наивысшим приоритетом является псевдоним bash, затем специальные встроенные функции (только в режиме POSIX), затем функции, затем встроенные функции, а затем поиск в
$PATH
.Чтобы выполнить встроенную функцию, используйте
builtin test
.Чтобы выполнить внешнюю программу, использовать явный путь:
/bin/test
.Чтобы игнорировать функции и псевдонимы, используйте
command test
.Чтобы обойти только псевдоним, используйте
\test
или любой другой вид расширения.Можно отключить / включить встроенную функцию
enable test
.(Обновлено в соответствии с комментариями ниже)
(Исправлено некорректное редактирование админкой, которое
disable
встроено в bash - фактически, есть толькоenable
)источник
\test
или'test'
илиtes't'
./
,$
, кавычка, и=
и любые метасимволы оболочки или символы цитирования, перечисленные выше, могут не отображаться в псевдониме ".Встроенные команды всегда предпочтительнее внешних команд. Смысл в том, что встроенная команда работает быстрее (и в некоторых случаях, например,
cd
или , только встроенная команда может дать желаемый эффект).test -o BASH_OPTION
Иногда внешняя команда может иметь возможности, которых нет у встроенной оболочки. В этом случае вы можете вызвать внешнюю команду, указав явный путь (то есть, содержащий косую черту) (это обходит любые опасения по поводу порядка в
$PATH
). Если вы не хотите жестко кодировать внешний путь, но хотите запретить использование встроенной функции, вы можете использовать"$(type -P test)"
(примечание заглавнуюP
) в bash,"$(whence -p test)"
в ksh и=test
в zsh. Другой способ принудительного использования внешней команды - использоватьcommand
встроенный (command -p test …
) или пройти черезenv
утилиту (env test …
).В zsh вы можете отключить встроенную функцию с помощью
disable test
. Это постоянно (для текущей оболочки или подоболочки), пока встроенная функция не будет включенаenable test
. В bash вы можете сделать то же самое сenable -n test
отключением иenable test
включением.Вы можете использовать псевдоним или функцию для принудительного выполнения другой команды, например
alias test=/usr/bin/test
илиtest () { /usr/bin/test "$@"; }
. Если у вас есть такой псевдоним, вы можете запретить его использование, заключив в кавычки любую его часть, например,\test
будет выполнять обычную функцию / встроенный / внешний поиск. Обратите внимание, что в зависимости от оболочки и ее настроек определения псевдонимов в функции могут быть расширены при чтении функции или при ее выполнении. Если вы определили функцию, вы можете использовать ееcommand test
для предотвращения поиска функций, а также поиска псевдонимов (поэтому здесьtest
встроенная функция будет вызываться, если она не отключена).источник
env
здесь тоже не подойдет?df
к PATH на первой позиции, удалил псевдоним 'df',which df
показывает / opt / bin / df, но df запускает / bin / df -> busyboxwhich df
не обязательно показывает вам, чтоdf
работает. unix.stackexchange.com/questions/85249/…