Не все утилиты, которые вы можете запустить по приглашению оболочки, на самом деле должны существовать как фактические исполняемые файлы в файловой системе. Они также могут быть так называемыми встроенными оболочками , что означает & ndash; Вы догадались, & ndash; что они встроены в оболочку.
Спецификация Single Unix, как правило, не указывает, должна ли служебная программа предоставляться как исполняемый файл или как встроенная, которая оставляется как частная внутренняя деталь реализации поставщику ОС. .
Единственными исключениями являются так называемые специальные встроенные модули , которые должны быть предоставлены как встроенные, поскольку они влияют на поведение Оболочка сама таким образом, что обычные исполняемые файлы (или даже обычные встроенные модули) не могут (например, set
, который устанавливает переменные, которые сохраняются даже после выхода set
). Эти специальные встроенные модули:
break
:
continue
.
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset
Обратите внимание, что cd
- это , а не в этом списке, что означает, что cd
не является специальной встроенной функцией. Фактически, в соответствии со спецификацией было бы совершенно законно реализовать cd
как обычный исполняемый файл. Это просто невозможно по причинам, указанным в других ответах.
И если вы прокрутите вниз до ненормативного раздела спецификации, то есть до части, которая официально не является частью спецификации, но является чисто информационной, вы обнаружите, что этот факт явно упоминается:
Поскольку cd влияет на текущую среду выполнения оболочки, он всегда предоставляется как обычная встроенная оболочка .
Итак, спецификация не требует, чтобы cd
был встроенным, но просто невозможно сделать иначе.
Обратите внимание, что иногда утилиты предоставляются как встроенные и как исполняемый файл. Хорошим примером является утилита time
, которая в типичной системе GNU предоставляется как исполняемый пакет Coreutils и как обычная встроенная оболочка Bash. Это может привести к путанице, потому что когда вы делаете man time
, вы получаете man-страницу исполняемого файла time
(встроенная функция time
описана в man builtins
), но когда вы выполняете time
, вы получаете time
встроенный, который не поддерживает те же функции, что и исполняемый файл time
, справочную страницу которого вы только что прочитали. Вы должны явно запустить /usr/bin/time
(или любой другой путь, по которому вы установили Coreutils), чтобы получить исполняемый файл.