В чем разница между встроенной командой и командой, которой нет?


72

Есть ли какая-либо внутренняя разница между встроенной командой и другой командой, которая может номинально делать то же самое?

например. Получают ли встроенные «особые» средства? ... есть ли на них меньше накладных расходов? .. или они просто «встроены»; как приборная панель вашего автомобиля?

... и есть ли определенный (текущий) список этих встроенных функций?

Ответы:


90

Судя по вашим комментариям, вы не совсем понимаете, что такое оболочка . Ядро отвечает за управление системой. Это часть, которая на самом деле загружает и запускает программы, получает доступ к файлам, выделяет память и т. Д. Но ядро ​​не имеет пользовательского интерфейса; вы можете общаться только с ним, используя другую программу в качестве посредника.

Оболочка - это программа, которая печатает приглашение, читает строку ввода от вас, а затем интерпретирует ее как одну или несколько команд для управления файлами или запуска других программ. До изобретения графического интерфейса оболочка была основным пользовательским интерфейсом ОС. В MS-DOS была вызвана оболочка, command.comи мало кто когда-либо пытался использовать другую. Однако в Unix уже давно существует несколько оболочек , из которых пользователи могут выбирать.

Их можно разделить на 3 типа. Bourne-совместимые оболочки используют синтаксис, полученный из оригинальной оболочки Bourne . C оболочка использует синтаксис из исходной оболочки C . Кроме того, существуют нетрадиционные оболочки, которые изобретают свой собственный синтаксис или заимствуют один из некоторых языков программирования и, как правило, гораздо менее популярны, чем первые два типа.

Встроенная команда - это просто команда, которую оболочка выполняет сама, вместо того, чтобы интерпретировать ее как запрос на загрузку и запуск какой-либо другой программы. Это имеет два основных эффекта. Во-первых, обычно это быстрее, потому что загрузка и запуск программы требуют времени. Конечно, чем дольше длится команда, тем меньше время загрузки по сравнению с общим временем выполнения (поскольку время загрузки довольно постоянное).

Во-вторых, встроенная команда может влиять на внутреннее состояние оболочки. Вот почему такие команды cd должны быть встроенными, потому что внешняя программа не может изменить текущий каталог оболочки. Другие команды, например echo, могут быть встроены для эффективности, но нет внутренней причины, по которой они не могут быть внешними командами.

Какие команды встроены, зависит от используемой вами оболочки. Вам придется ознакомиться с его документацией для получения списка (например, bashвстроенные команды перечислены в главе 4 его руководства ). Команда typeможет сказать вам, является ли команда встроенной (если ваша оболочка совместима с POSIX), потому что POSIX требует, чтобы typeона была встроенной. Если whichон не встроен в вашу оболочку, то он, вероятно, не будет знать о встроенных программах вашей оболочки, а будет просто искать внешние программы.


Приложения связываются с ядром, фактически выполняя прерывания.
Натан Осман,

11
@ Джордж: приложения связываются с ядром, выпуская системные вызовы, которые в зависимости от ОС и архитектуры могут использовать или не использовать прерывания. Пользователи, как правило, не выдают прерываний.
Жиль "ТАК - перестань быть злым"

2
@cjm: Звучит так просто, когда вы объясняете это так:) ... вы наверняка помогли рассеять туман ... просто легкий туман сейчас ... (на самом деле, именно такая погода сегодня здесь. .. приятно туманный;) ... спасибо
Peter.O

@ Жиль: Действительно? Я думал, что все программы пользовательского режима связываются с ядром через прерывания (на определенных архитектурах, конечно).
Натан Осман

2
@cjm Очень подробный и поучительный ответ. Я многому научился, читая это. :)
ankush981

37

Есть три уровня встроенных утилит:

  • Некоторые утилиты действительно являются частью оболочки как языка программирования, хотя они не являются зарезервированными словами . Они являются утилитами управления потоком ( ., :, 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).


3
Эти различия являются действительно важными.
dmckee

Быстрый вопрос, так что же означает «обычное назначение параметров», когда мы это делаем while IFS= read -r line?
Сергей Колодяжный

@SergiyKolodyazhnyy readне является специальной встроенной функцией , поэтому IFS=readустанавливает переменную только на время выполнения команды.
Жиль "ТАК - перестань быть злым"

10

Встроенная команда - это команда, предоставляемая оболочкой, а не внешней программой. Вот списки bashвстроенных функций (они также перечислены на странице руководства bash) и zshвстроенных функций . kshпредоставляет список, запустив builtin.

Чтобы узнать, является ли конкретная команда встроенной, вы можете запустить type command. Попробуйте type forи type lsувидеть это.


typeкажется, делает трюк; спасибо за это ... но я все еще задаюсь вопросом, что означает "обеспеченный оболочкой" ... Возможно, мне нужно более полно понять, как оболочка относится к ядру .... но не в 2 часа ночи .. Я приду вернемся к этому завтра
Peter.O

1

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

Вы можете легко узнать, является ли конкретная команда встроенной или нет, запустив ее type mycommand. Большинство man-страниц оболочки также имеют список своих встроенных функций.

Редактировать: Используйте, typeчтобы узнать, является ли команда встроенной, а если нет, whichузнать, откуда она будет выполняться.


@Caleb: спасибо за ваш комментарий, но это заставляет меня задуматься о том, что такое "системный процесс" ... Я продолжаю видеть ссылки на него, но не понимаю, где лежит различие .... (кстати, я не могу Посмотрите, как «который» является абсолютным индикатором) .. например .. », какой =>"/bin/echo" and тип эха echo =>"echo is a shell builtin", but 'which dd=>" / bin / dd "и type dd=>" dd is / bin / dd "... так что я отчасти ....
Peter.O

«System procses» означает, что он запускается как независимое приложение, управляемое ядром. Альтернативой в случае встроенных функций является просто запуск подфункции в уже запущенном коде вашей оболочки. В приведенном вами примере typeэто лучший индикатор того, что выполняется, но вы заметили, что он echoявляется встроенным, и есть приложение с таким именем. Если ваша оболочка не имеет встроенной системы, ее можно запустить.
Калеб

2
whichне обязательно является встроенной командой, и если это не так, она не будет знать о встроенных командах оболочки. POSIX требует, чтобы typeэто была встроенная команда, поэтому он всегда знает о встроенных модулях.
CJM

Многие системы поставляются с псевдонимом whichto typeили некоторым набором опций, например alias which='type -path'- это может быть источником путаницы.
Random832

1
Я не могу отказать в этом, пока не whichбудет заменено type. Я использовал то, что снова и снова, не зная об этом, typeи был очень удивлен, если учесть выбор whichмежду программами.
пользователь неизвестен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.