Де зберігаються функції оболонки в 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 у розділі ІНВОКАЦІЯ.

Функції оболонки, визначені користувачем, динамічно завантажуються в хеш (або таблицю пошуку) при запуску 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

Дякую за відповідь уривку. Це саме те, що я шукав. Як ви думаєте, чи є інструмент для слідування за процесом створення bash чи щось подібне, typesetяке б показувало, який файл / сценарій спричинив створення / зміну функції?
Габріель Шімунович

Я не знаю жодного такого інструменту - це було б корисним варіантом для команди declareабо typesetдля відображення вихідного файла визначення функції. Я думаю, це проблема інженерії програмного забезпечення. Нещодавно знайдена функція оболонки, визначена у .aliasфайлі - не те, чого я очікував!
підозрюваний

8

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


1
Ефемерна природа чогось, що ви вводите підказку, важлива. Мій голос іде на цю відповідь. Якщо ви введете cd () { pwd; builtin cd "$@"; }підказку, єдине місце, яке зберігається, - це пам'ять поточної оболонки, що працює. (Мій приклад - Bash, але той самий принцип застосовується до будь-якої оболонки.)
tripleee

6

cdта інші загальні команди, такі як echo, typeі aliasтак звані вбудовані .

Вбудовані команди містяться в самій оболонці, і різні оболонки можуть мати різні вбудовані команди.


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, а не в оболонках POSIX.

Дякуємо Blue Raspberry, що знайшли це!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.