11

Сначала я искал причину, по which ничего не выводится после предоставления в качестве аргумента определенных программ, например, cd .

Из того, что я нашел здесь, причина, вероятно, заключается в том, что cd на моей машине - это функция, которая подтверждается запуском type cd .

TLDR: Но как обычные программы, which можно найти благодаря $PATH , помещаются в одну из этих папок $PATH , где хранятся функции или сценарии, такие как cd ?

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}

4 ответа4

12

Пользовательские функции

Обычно функции bash постоянно хранятся в скрипте запуска bash .

  • Общесистемные сценарии запуска: /etc/profile для оболочек входа в систему и /etc/bashrc для интерактивных оболочек.
  • Пользователь определяет сценарии запуска: ~/.bash_profile для оболочек входа в систему и ~/.bashrc для интерактивных оболочек.
  • Более подробная информацию о интерактивных / оболочках входа в системе можно найти в справочной странице Баша в разделе Призыва.

Пользовательские функции оболочки загружаются динамически в хеш (или таблицу поиска) при запуске bash. Из исходного файла bash variable.c определение таблицы:

/* The list of shell functions that the user has created, or that came from
   the environment. */
HASH_TABLE *shell_functions = (HASH_TABLE *)NULL;

Пользовательские функции могут быть перечислены с помощью команды bash declare , другие оболочки по-прежнему используют typeset . В Баш declare вытеснили на typeset команду.

declare -f

Функции существуют в памяти в течение всего времени жизни оболочки bash.

Определенные (встроенные) функции оболочки

Это общие функции, такие как echo , printf , cd и : Они скомпилированы в библиотеку, которая связана с исполняемым файлом bash . Встраивание определений в исполняемый файл экономит время по сравнению с загрузкой внешнего определения. Определения для этих функций (хранятся в исходных файлах .def которые разбираются в исходный код C) содержатся в каталоге builtins файлов исходного кода bash.

Полезное замечание: для информации о встроенной команде оболочки используйте help <command> . например

help                # list all builtins
help declare        # info and options for declare
help -m declare     # gives man style information for declare
8

Функции оболочки хранятся в памяти оболочки (или, возможно, в недокументированных временных файлах).  Они не могут быть использованы каким-либо образом, пока не будет запущена оболочка (например, когда вы входите в CLI или запускаете окно оболочки, например xterm), и они определяются (например, читая .bashrc , .bash_profile или что-то подобное ) и они перестают существовать, когда оболочка заканчивается.

6

cd и другие распространенные команды, такие как echo , type & alias являются так называемыми встроенными командами.

Встроенные команды содержатся внутри самой оболочки, и разные оболочки могут иметь разные встроенные команды.

1

Вопрос суперпользователя Нахождение определения функции bash тесно связано с этим.  Пользователь HairOfTheDog предоставил этот ответ (перефразированный):

Следующие команды сообщат местоположение (имя файла и номер строки) определения функции.  Предполагая функцию с именем foo ,

# Turn on extended shell debugging
shopt -s extdebug

# Display the function’s name, line number and fully qualified source file
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

Например, выходные данные этих команд могут быть:

foo 32 /source/private/main/developer/cue.pub.sh

Вышесказанное может работать только в bash , а не в оболочках POSIX вообще.

Спасибо Blue Raspberry за это!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .