Судя по вашим комментариям, вы не совсем понимаете, что такое оболочка . Ядро отвечает за управление системой. Это часть, которая на самом деле загружает и запускает программы, получает доступ к файлам, выделяет память и т. Д. Но ядро не имеет пользовательского интерфейса; вы можете общаться только с ним, используя другую программу в качестве посредника.
Оболочка - это программа, которая печатает приглашение, читает строку ввода от вас, а затем интерпретирует ее как одну или несколько команд для управления файлами или запуска других программ. До изобретения графического интерфейса оболочка была основным пользовательским интерфейсом ОС. В MS-DOS была вызвана оболочка, command.com
и мало кто когда-либо пытался использовать другую. Однако в Unix уже давно существует несколько оболочек , из которых пользователи могут выбирать.
Их можно разделить на 3 типа. Bourne-совместимые оболочки используют синтаксис, полученный из оригинальной оболочки Bourne . C оболочка использует синтаксис из исходной оболочки C . Кроме того, существуют нетрадиционные оболочки, которые изобретают свой собственный синтаксис или заимствуют один из некоторых языков программирования и, как правило, гораздо менее популярны, чем первые два типа.
Встроенная команда - это просто команда, которую оболочка выполняет сама, вместо того, чтобы интерпретировать ее как запрос на загрузку и запуск какой-либо другой программы. Это имеет два основных эффекта. Во-первых, обычно это быстрее, потому что загрузка и запуск программы требуют времени. Конечно, чем дольше длится команда, тем меньше время загрузки по сравнению с общим временем выполнения (поскольку время загрузки довольно постоянное).
Во-вторых, встроенная команда может влиять на внутреннее состояние оболочки. Вот почему такие команды cd
должны быть встроенными, потому что внешняя программа не может изменить текущий каталог оболочки. Другие команды, например echo
, могут быть встроены для эффективности, но нет внутренней причины, по которой они не могут быть внешними командами.
Какие команды встроены, зависит от используемой вами оболочки. Вам придется ознакомиться с его документацией для получения списка (например, bash
встроенные команды перечислены в главе 4 его руководства ). Команда type
может сказать вам, является ли команда встроенной (если ваша оболочка совместима с POSIX), потому что POSIX требует, чтобы type
она была встроенной. Если which
он не встроен в вашу оболочку, то он, вероятно, не будет знать о встроенных программах вашей оболочки, а будет просто искать внешние программы.
Есть три уровня встроенных утилит:
Некоторые утилиты действительно являются частью оболочки как языка программирования, хотя они не являются зарезервированными словами . Они являются утилитами управления потоком (
.
,:
,break
,continue
,return
,trap
,exit
,exec
,eval
), параметр связанных утилиты (set
,unset
,shift
,export
,readonly
,local
¹,typeset
¹), псевдоним коммунальных услуг (alias
²,unalias
²) иtimes
³. Эти специальные встроенные модули получают специальную обработку:foo=bar utility
имеет другое значение: это обычное присваивание параметров (т. Е. Эквивалентноеfoo=bar; utility
) вместо присвоения среде только на время работы утилиты.Некоторые утилиты должны быть реализованы внутри оболочки, поскольку они действуют на внутренние настройки оболочки. Это включает в себя:
cd
,dirs
,pushd
,popd
;bg
,disown
,fg
,jobs
,wait
;builtin
,command
,hash
,read
,type
,ulimit
,umask
;fc
,history
,bind
.echo
,printf
,test
,true
,false
.Расширенные оболочки, такие как bash , ksh и zsh, обычно имеют больше встроенных функций, часто для реализации нестандартных функций (обычно для взаимодействия). В руководстве по каждой оболочке будет указано, какие команды являются встроенными, хотя некоторые оболочки ( по крайней мере, zsh ) поддерживают динамически загружаемые модули, которые могут предоставлять больше встроенных модулей.
¹ Неизвестный для POSIX, но особенный для ksh и некоторых других оболочек.
² Обычный в POSIX, но особенный в ksh и некоторых других оболочках.
³ In
ksh
,times
это обертка вокругtime
ключевого слова: это псевдоним для{ { time;} 2>&1;}
. Обратите внимание, что POSIX позволяетtime
быть внешней утилитой с обычным синтаксическим анализом или ключевым словом, которое применяется ко всему конвейеру (который находится в ksh, bash в zsh).источник
while IFS= read -r line
?read
не является специальной встроенной функцией , поэтомуIFS=read
устанавливает переменную только на время выполнения команды.Встроенная команда - это команда, предоставляемая оболочкой, а не внешней программой. Вот списки
bash
встроенных функций (они также перечислены на странице руководства bash) иzsh
встроенных функций .ksh
предоставляет список, запустивbuiltin
.Чтобы узнать, является ли конкретная команда встроенной, вы можете запустить
type command
. Попробуйтеtype for
иtype ls
увидеть это.источник
type
кажется, делает трюк; спасибо за это ... но я все еще задаюсь вопросом, что означает "обеспеченный оболочкой" ... Возможно, мне нужно более полно понять, как оболочка относится к ядру .... но не в 2 часа ночи .. Я приду вернемся к этому завтраКаждый дистрибутив и оболочка имеют различную коллекцию команд и встроенные функции оболочки. Как правило, идея заключается в том, что оболочка встраивает наиболее распространенные и простые функции для экономии времени, скорости и интеграции воли с остальным набором функций. Накладные расходы намного ниже, поскольку не нужно запускать другой системный процесс. Однако можно смешивать и сочетать. Вы можете запустить одну оболочку, в которой есть что-то встроенное, но эта команда тоже есть в вашей системе. Обычно встроенные функции имеют приоритет, но вы можете это контролировать.
Вы можете легко узнать, является ли конкретная команда встроенной или нет, запустив ее
type mycommand
. Большинство man-страниц оболочки также имеют список своих встроенных функций.Редактировать: Используйте,
type
чтобы узнать, является ли команда встроенной, а если нет,which
узнать, откуда она будет выполняться.источник
=>"/bin/echo" and
тип эха echo=>"echo is a shell builtin", but 'which dd
=>" / bin / dd "иtype dd
=>" dd is / bin / dd "... так что я отчасти ....type
это лучший индикатор того, что выполняется, но вы заметили, что онecho
является встроенным, и есть приложение с таким именем. Если ваша оболочка не имеет встроенной системы, ее можно запустить.which
не обязательно является встроенной командой, и если это не так, она не будет знать о встроенных командах оболочки. POSIX требует, чтобыtype
это была встроенная команда, поэтому он всегда знает о встроенных модулях.which
totype
или некоторым набором опций, напримерalias which='type -path'
- это может быть источником путаницы.which
будет замененоtype
. Я использовал то, что снова и снова, не зная об этом,type
и был очень удивлен, если учесть выборwhich
между программами.