Каждая оболочка Unix имеет как минимум некоторые встроенные команды. Эти встроенные команды являются частью оболочки и реализованы как часть исходного кода оболочки. Оболочка распознает, что команда, которую она попросила выполнить, была одним из ее встроенных, и сама выполняет это действие, не вызывая отдельного исполняемого файла. Различные оболочки имеют разные встроенные функции, хотя в базовом наборе будет много перекрытий.
Иногда встроенные функции встроены по соображениям производительности. В этом случае часто существует версия этой команды в $PATH
(возможно, с другим набором функций, различным набором признанных аргументов командной строки и т. Д.), Но оболочка решила реализовать команду как встроенную, чтобы она могла сохраните работу, порожденную недолговечным процессом, чтобы выполнить какую-то работу, которую он мог бы сделать сам. Это имеет место для Баш и Printf, например:
$ type printf
printf is a shell builtin
$ which printf
/usr/bin/printf
$ printf
printf: usage: printf [-v var] format [arguments]
$ /usr/bin/printf
/usr/bin/printf: missing operand
Try `/usr/bin/printf --help' for more information.
Обратите внимание, что в приведенном выше примере, Printf является как оболочка встроенной (реализован как часть самой Баш), а также внешней команды (находится в/USR/бен/Printf). Обратите внимание, что они ведут себя по-другому - при вызове без аргументов встроенная версия и версия команды печатают разные сообщения об ошибках. Обратите внимание также, что опция -v var
(сохранить результаты этого printf в переменную оболочки с именем var
) может быть выполнена только как часть оболочки. Подпроцессы, такие как/usr/bin/printf, не имеют доступа к переменным оболочки, которая их выполняла.
И это подводит нас к второй части истории: некоторые команды встроены, потому что они должны быть. Некоторые команды, такие как chmod
, представляют собой тонкие обертки вокруг системных вызовов. Когда вы запускаете /bin/chmod 777 foo
, вилки оболочки, execs/bin/chmod (передающие «777» и «foo») в качестве аргументов, а новый процесс chmod запускает код C chmod("foo", 777);
, а затем возвращает управление оболочке. Однако это не сработало бы для команды cd
. Несмотря на то, что cd
выглядит так же, как chmod
, он должен вести себя по-другому: если оболочка породила другой процесс для выполнения системного вызова chdir
, он изменил бы каталог только для этого вновь созданного процесса, а не для оболочки. Затем, когда процесс вернется, оболочка останется сидеть в том же каталоге, что и все это время, поэтому cd
должен быть реализован как встроенная оболочка.
Это не имеет никакого отношения к ядру. –