Я заметил, что команда типа cd ..
на самом деле преобразуется в builtin cd ..
и затем выполняется. Но как builtin
определено? which builtin
ничего не показывает и его нет в /bin
и /usr/bin
т. д. Это просто часть программы bash и обрабатывается по-другому?
решение1
Builtins — это просто часть bash. Вы можете узнать, является ли команда встроенной, используя type
. Например:
$ type export cd source alias
export is a shell builtin
cd is a shell builtin
source is a shell builtin
alias is a shell builtin
Многие встроенные команды являются встроенными, потому что они не могут работать по-другому, cd
и source
являются примерами.
Другие встроенные функции созданы исключительно для повышения эффективности test
(т. н. э. [...]
) и echo
являются примерами.
Чтобы узнать больше, см. SHELL BUILTIN COMMANDS
раздел man bash
или онлайнруководство по bash. Чтобы получить список доступных встроенных команд, запустите help
в командной строке. Чтобы получить информацию о конкретной встроенной команде, скажем test
, запустите help test
. Обратите внимание, что help test
предоставит информацию о test
встроенной команде bash, тогда как, напротив, man test
скорее всего предоставит справку о внешней test
команде.
Какие команды доступны как исполняемые, так и встроенные
С -a
опцией type
отобразит все места, содержащие указанную команду. Например:
$ type -a echo
echo is a shell builtin
echo is /bin/echo
Как использовать исполняемый файл, если доступен встроенный
Если по какой-то странной причине вы хотите использовать определенный исполняемый файл, а не встроенную в оболочку команду, все, что вам нужно сделать, это указать путь:
$ /bin/echo "This is not the builtin"
This is not the builtin
Поскольку встроенные функции обычно имеют больше функций, это обычно полезно только для тестирования совместимости.
Как выполнить встроенную функцию оболочки, если она скрыта функцией или псевдонимом
При наличии выбора оболочка обычно выбирает выполнение встроенной команды. Исключением является случай, когда пользователь определил псевдоним или функцию с тем же именем. Если вы хотите быть уверены, что выполняете встроенную команду, используйте команду builtin
:
$ builtin echo 1 2 3
1 2 3