Shell builtin что это
Shell встроенного исполнения
Теперь давайте посмотрим на не встроенный grep :
Похоже, что cd является отдельным двоичным файлом. Чем выполнение cd (или любого другого встроенного) отличается от выполнения grep (или любого другого не встроенного)?
2 ответа
Важно отметить, что встроенная версия и внешняя программа могут отличаться. В некоторых случаях вы можете предпочесть использование встроенной функции (т. Е. Если вы знаете, в какой оболочке будет использоваться ваш скрипт, но не знаете, какая именно внешняя версия будет выполняться), или наоборот.
Вы можете вызвать внешнюю программу, используя ее полный путь (это обойдёт встроенную функцию).
При вызове внешней программы операционная система запускает отдельный процесс, в то время как встроенная программа является частью самой программы оболочки и, следовательно, будет иметь намного меньшие издержки. Во многих случаях эти издержки незначительны, но если вы собираетесь выполнять команду много раз, это может оказать существенное влияние на производительность вашего скрипта.
В дополнение к правильному ответу Фреда:
Я понимаю ваше замешательство по поводу встроенных и внешних команд. Команда cd на самом деле хороша для небольшой демонстрации.
Например, в моей системе ситуация выглядит следующим образом:
На странице справки встроенной команды cd :
Теперь вы можете увидеть, как команда builtin может использоваться для принудительного выполнения встроенной команды оболочки. Это может быть очень полезно в особых случаях.
Кроме того, вы можете (это на самом деле очевидно) ожидать большей производительности от встроенных команд [источник] :
Глава 11. Внутренние команды
В общем случае, встроенные команды Bash, при исполнении внутри сценария, не порождают новый подпроцесс, в то время как вызов внешних команд, как правило, приводит к созданию нового подпроцесса.
Ввод/вывод
выводит (на stdout) выражение или содержимое переменной (см. Пример 4-1).
Типичная конструкция цикла while с getopts несколько отличается от стандартной из-за отсутствия квадратных скобок, проверяющих условие продолжения цикла. Пример getopts, заменившей устаревшую, и не такую мощную, внешнюю команду getopt. Пример 11-17. Прием опций/аргументов, передаваемых сценарию, с помощью getopts Управление сценарием Пример 11-18. «Подключение» внешнего файла Файл data-file для Пример 11-18, представленного выше, должен находиться в том же каталоге. Сценарий может подключить даже самого себя, только этому едва ли можно найти какое либо практическое применение. Пример 11-19. Пример (бесполезный) сценария, который подключает себя самого. Безусловное завершение работы сценария. Команде exit можно передать целое число, которое будет возвращено вызывающему процессу как код завершения. Вообще, считается хорошей практикой завершать работу сценария, за исключением простейших случаев, командой exit 0, чтобы проинформировать родительский процесс об успешном завершении.
ПримечанияКак правило, исходные тексты подобных библиотек, на языке C, располагаются в каталоге /usr/share/doc/bash-. /functions. Понимание встроенных команд оболочкиВ руководстве по bash написано, что Кроме того, этот ответ гласит, что (вывод в переменную), что внешнее /usr/bin/printf просто не сможет сделать, так как у него нет доступа к переменным оболочки в текущем сеансе оболочки (и они не могут их изменить). Встроенные утилиты также не имеют ограничения, что их расширенная командная строка должна быть короче определенной длины. дела Поэтому безопасно, если printf это встроенная команда оболочки. Ограничение длины командной строки исходит из execve() функции библиотеки C, используемой для выполнения внешней команды. Если командная строка и текущая среда больше ARG_MAX байтов (см. getconf ARG_MAX В оболочке), вызов execve() завершится ошибкой. Если утилита встроена в оболочку, execve() вызывать не нужно. Существует небольшой список утилит, которые необходимо встроить в оболочку (взят из списка специальных встроенных модулей стандарта POSIX ) Они должны быть встроены, так как они напрямую управляют средой и потоком программы текущего сеанса оболочки. Внешняя утилита не сможет этого сделать. Интересно, cd что не входит в этот список, но POSIX говорит об этом следующее :
это не влияет на рабочий каталог среды вызывающего. Поэтому я предполагаю, что «специальные» встроенные модули не могут иметь внешних аналогов, в то время как cd теоретически могут иметь (но это не очень поможет). В чем разница между ключевым словом shell builtin и shell?Когда я запускаю эти две команды, я получаю 3 ответаСуществует сильное различие между встроенным и ключевым словом в том, как Bash анализирует ваш код. Прежде чем говорить о различии, давайте перечислим все ключевые слова и встроенные функции: Ключевое слово отсканировано и понято Bash в самом начале его разбора. Это позволяет, например, следующее: Это отлично работает, и Bash с радостью выведет показывает, что Bash не доволен: На практике вы видите, что это различие допускает сложное поведение, что было бы невозможно со встроенными (или командами). На практике, как вы можете отличить встроенное от ключевого слова? это забавный эксперимент для выполнения: О. Это потому, что, когда Bash видит эту строку, он не видит ничего особенного и, следовательно, расширяет все переменные и, в конце концов, видит: В одних и тех же строках: Обоснование одно и то же: расширение псевдонима происходит задолго до переменнойрасширение и удаление цитат. Ключевое слово v.s. Алиас Теперь, что вы думаете, если мы определяем псевдоним как ключевое слово? О, это работает! поэтому псевдонимы могут использоваться для ключевых слов с псевдонимами! приятно знать. С другой стороны, ключевые слова сканируются и понимаются очень рано и допускают сложное поведение оболочки: оболочка сможет запретить расщепление слов или расширение пути и т. д. Теперь просмотрите список встроенных и ключевых слов и попытайтесь выяснить, почему некоторые из них должны быть ключевыми словами. , но это запретит такие конструкции, как: То же самое для time : это более мощно, чтобы иметь ключевое слово, чтобы он мог со временем сложным составным командам и конвейерами перераспределять: Попробуйте исправить (?) это: Ключевое слово vs alias? Как вы думаете, что происходит? Это распознавание происходит только тогда, когда ни один из символов не цитируется, и когда слово используется как: Первое слово команды Первое слово, следующее за одним из зарезервированных слов, отличное от case, for или in Третье слово в команде case (только в этом случае действительно) Третье слово в команде for (только в этом случае и действительны в этом случае) Sidenote
|