Сначала я искал причину, по которой which
ничего не выводится после предоставления в качестве аргумента определенных программ, например cd
.
Из того, что я нашел здесь , причина, вероятно, заключается в том, что cd
на моей машине есть функция, которая подтверждается запуском type cd
.
TLDR: Но как обычные программы, которые which
могут быть найдены благодаря $PATH
переменной, помещаются в одну из этих $PATH
папок, где хранятся функции или скрипты cd
?
user@linuxmchine:~$ type cd
cd is a function
cd ()
{
__zsh_like_cd cd "$@"
}
linux
bash
shell-script
Габриэль Шимунович
источник
источник
cd is a shell builtin
. Взгляните на страницу руководства для вашей оболочки (zsh?)Ответы:
Пользовательские функции
Обычно функции bash постоянно хранятся в
bash
стартовом скрипте./etc/profile
для оболочек входа в систему и/etc/bashrc
для интерактивных оболочек.~/.bash_profile
для оболочек входа в систему и~/.bashrc
для интерактивных оболочек.man
странице bash в разделе INVOCATION.Определяемые пользователем функции оболочки загружаются динамически в хэш (или таблицу поиска) при запуске bash. Из исходного файла bash
variable.c
определение для таблицы:Пользовательские функции могут быть перечислены с помощью
declare
команды bash , другие оболочки все еще используютtypeset
. В bashdeclare
вышлаtypeset
команда.Функции существуют в памяти в течение всего времени жизни оболочки bash.
Определенные (встроенные) функции оболочки
Эти общие функции , такие как
echo
,printf
,cd
и:
. Они скомпилированы в библиотеку, которая связана сbash
исполняемым файлом. Встраивание определений в исполняемый файл экономит время по сравнению с загрузкой внешнего определения. Определения для этих функций (хранятся в.def
исходных файлах, которые анализируются в C-источнике) содержатся вbuiltins
каталоге исходного кода bash.Полезное в стороне: для информации по использованию встроенной команды оболочки
help <command>
. напримеристочник
typeset
, чтобы показать, какой файл / скрипт вызвал создание / изменение функции?declare
или,typeset
чтобы отобразить исходный файл определения функции. Я думаю, что это проблема разработки программного обеспечения. Недавно нашел функцию оболочки, определенную в.alias
файле - не то, что я ожидал!Функции оболочки хранятся в памяти оболочки (или, возможно, в недокументированных временных файлах). Они не существуют в любом используемом пути до запуска оболочки (например, при входе в CLI или запустить окно оболочки , такие как
xterm
) , и они определены (например, чтение.bashrc
,.bash_profile
или что - то подобное) , и они перестают существует, когда оболочка завершается.источник
cd () { pwd; builtin cd "$@"; }
в приглашении, то единственное место, которое хранится, находится в памяти вашей текущей запущенной оболочки. (Мой пример - Bash, но тот же принцип применим к любой оболочке.)cd
и другие команды общие нравитсяecho
,type
иalias
так называемые внутренние команды .Встроенные команды содержатся внутри самой оболочки, и разные оболочки могут иметь разные встроенные команды.
источник
cd
, содержится в самой программе оболочки, например, в файле,/bin/bash
если это ваша оболочка. (Я действительно думаю, что ваша формулировка здесь ясна, но я видел, как люди путались во всевозможных вещах.)Вопрос суперпользователя Нахождение определения функции bash тесно связано с этим. Пользователь HairOfTheDog предоставил этот ответ (перефразированный):
Вышесказанное может работать только в
bash
оболочках POSIX, а не в них вообще.Спасибо Blue Raspberry за это!
источник