Bash встроенная «история» может быть выполнена, но не в $ PATH - PullRequest
1 голос
/ 22 февраля 2020

Я знаю, что встроенные функции оболочки загружаются в память, и я подумал, что могу найти все встроенные функции в / usr / bin или где-нибудь в echo $PATH. Я пытался выяснить, как работает команда истории. Я предположил, что это чтение из ~ / bash_history. Поэтому я попытался objdump -S $(which history)

which history
echo $?

1

Это не вернуло путь к команде, из-за которой я могу найти бинарный файл для истории.

type -t which
builtin

Я предполагаю, что это означает, что он загружен в память. Так же как и процесс оболочки загружает встроенные функции, которые хранятся вне echo $PATH

1 Ответ

3 голосов
/ 22 февраля 2020

Встроенная оболочка буквально встроена в сам исполняемый файл оболочки. Он вызывается оболочкой не как отдельный процесс, а просто как обычный вызов функции внутри процесса оболочки. Поэтому, если вы хотите найти его исходный код, вам нужно посмотреть в исходный код bash.

Для многих встроенных функций, таких как cd, основная причина этого быть встроенным в том, что он изменяет состояние самой оболочки. Было бы бессмысленно иметь cd в качестве отдельного процесса, поскольку этот процесс будет изменять только свой текущий каталог, а не каталог процесса оболочки. В случае history причина, по-видимому, заключается в том, что ~/.bash_history записывается только при выходе из оболочки, поэтому команде также необходим доступ к истории текущего сеанса в памяти, которая содержится в работающей bash обработать. Для других встроенных функций, таких как echo, причина заключается в производительности: предполагается, что команда используется так часто, что мы хотим избежать порождения нового процесса каждый раз, когда он вызывается (но если вы действительно хотите процесс, есть также /bin/echo, который может вести себя по-разному).

...