Где хранятся функции оболочки в Linux?

11

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

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

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

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}
Габриэль Шимунович
источник
Я получаю cd is a shell builtin. Взгляните на страницу руководства для вашей оболочки (zsh?)
Xen2050
1
Проверьте unix.stackexchange.com/questions/85249/… Проблема в том, что это устаревшая команда, которая не должна использоваться - особенно из-за таких вещей, как этот вопрос.
Джо

Ответы:

12

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

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

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

Определяемые пользователем функции оболочки загружаются динамически в хэш (или таблицу поиска) при запуске 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;

Пользовательские функции могут быть перечислены с помощью declareкоманды bash , другие оболочки все еще используют typeset. В bash 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
suspectus
источник
Спасибо за этот ответ выдержки. Это именно то, что я искал. Как вы думаете, есть ли инструмент для отслеживания процесса создания функций bash или что-то подобное typeset, чтобы показать, какой файл / скрипт вызвал создание / изменение функции?
Габриэль Шимунович
Я не знаю ни одного такого инструмента - это была бы полезная опция для команды declareили, typesetчтобы отобразить исходный файл определения функции. Я думаю, что это проблема разработки программного обеспечения. Недавно нашел функцию оболочки, определенную в .aliasфайле - не то, что я ожидал!
Подозреваемый
8

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

G-Man говорит: «Восстанови Монику»
источник
1
Эфемерная природа того, что вы вводите в подсказке, важна. Мой голос идет на этот ответ. Если вы наберете cd () { pwd; builtin cd "$@"; }в приглашении, то единственное место, которое хранится, находится в памяти вашей текущей запущенной оболочки. (Мой пример - Bash, но тот же принцип применим к любой оболочке.)
tripleee
6

cdи другие команды общие нравится echo, typeи aliasтак называемые внутренние команды .

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

Nifle
источник
4
Я не знаю, стоит ли подчеркивать, что исполняемый код для встроенных команд, таких как cd, содержится в самой программе оболочки, например, в файле, /bin/bashесли это ваша оболочка. (Я действительно думаю, что ваша формулировка здесь ясна, но я видел, как люди путались во всевозможных вещах.)
David Z
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 за это!

G-Man
источник