Инструменты, встроенные в оболочку - PullRequest
2 голосов
/ 13 декабря 2011

Мне было интересно, какие инструменты встроены в оболочку bash. Например, type pwd говорит мне, что pwd встроен в оболочку.

whereis pwd
/bin/pwd /usr/include/pwd.h /usr/share/man/man1/pwd.1.gz

aptitude search pwd

(кажется) ничего не дает на pwd, который я использую. (Я работаю в системе Debian.)

- Есть ли какой-нибудь способ узнать, что встроено? Кроме грубой силы с type, то есть.

- Является ли pwd в папке bin (выше) тем же pwd, который встроен? Загружается ли он в оболочку при инициации? Или он выполняется из этой папки оболочкой? Если да, то каким образом он встроен?

- Почему вещи встроены в первую очередь? Они специально настроены для соответствия оболочке или просто для того, чтобы их можно было вызывать изнутри, чтобы они не требовали нового процесса? Мне удалось поймать pwd с pwd & и ps. Это обходной путь или это отдельные процессы?

- Не стесняйтесь рассказать мне что-нибудь еще по теме:)

Ответы [ 7 ]

3 голосов
/ 13 декабря 2011

Есть ли способ узнать, какие вещи встроены?

help даст вам полный список.Вы можете запустить help со встроенной командой в качестве аргумента, чтобы получить более подробную информацию.info "(bash) Shell Builtin Commands" отобразит руководство по Bash для всех встроенных функций.

Является ли pwd в папке bin (сверху) тем же pwd, что встроено?

Нет, они совершенно разные:

$ builtin pwd --help
bash: pwd: --: invalid option
pwd: usage: pwd [-LP]

$ /bin/pwd --help
Usage: /bin/pwd [OPTION]...
Print the full filename of the current working directory.

  -L, --logical   use PWD from environment, even if it contains symlinks
  -P, --physical  avoid all symlinks
      --help     display this help and exit
      --version  output version information and exit

NOTE: your shell may have its own version of pwd, which usually supersedes
the version described here.  Please refer to your shell's documentation
for details about the options it supports.

Report bugs to <bug-coreutils@gnu.org>.

Почему вещи встроены в первую очередь?Они специально настроены для соответствия оболочке, или это просто для того, чтобы их можно было вызывать внутри, чтобы они не требовали нового процесса?

Из руководства: «Для реализации необходимы встроенные командыфункциональность, которую невозможно или неудобно получить с помощью отдельных утилит ".Было бы трудно заставить команду, подобную cd, работать внешне, потому что она влияет на состояние оболочки.Конечно, легко повторить поведение pwd или true, но стандарт POSIX требует, чтобы они были встроенными .

Мне удалось пойматьpwd с pwd & и ps.Это обходной путь или это отдельные процессы?

Запуск встроенный & заставит Bash запустить подоболочку в фоновом режиме.Вы можете легко увидеть это, выполнив read &, так как read ждет, пока он не введет данные.

1 голос
/ 13 декабря 2011

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

help

, вы получите полный список.Причина для встроенных модулей заключается в том, что они более эффективны, поскольку их вызов не включает в себя новый процесс.Если вы не хотите использовать встроенную функцию для данной команды, а вместо самой команды, вы должны указать полный путь команды к оболочке.например,

/bin/echo

вместо просто echo

1 голос
/ 13 декабря 2011

man builtin покажет вам, какие команды встроены и как они выполняются.Со страницы man:

Встроенные команды оболочки - это команды, которые могут выполняться внутри процесса работающей оболочки.

Также на этой странице руководства вы можете узнать, какие другие процессывстроенный. Используйте man pwd, чтобы узнать вашу конкретную версию pwd.

Страницы руководства ваши друзья:)

1 голос
/ 13 декабря 2011

Для получения полного списка встроенных команд оболочки используйте man bash. Встроенная команда - это команда, скомпилированная оболочкой внутри фактического исполняемого файла оболочки. Таким образом, если по какой-то причине у вас нет команды echo, вы все равно можете запустить ее из оболочки. Это удобно для урезанных систем (таких как встроенные устройства) или в случаях, когда вы случайно удалили разделы жесткого диска.

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

1 голос
/ 13 декабря 2011

Страница справочника bash (man bash) перечисляет встроенные модули.

which команда покажет, где находятся не встроенные модули, с учетом ${PATH} и т. П.

Файлы в /bin/ являются заменой, если вы используете оболочку, в которой они отсутствуют как встроенные.

Они встроены для повышения эффективности, чтобы избежать fork / exec, но, в частности, bash обычно достаточно умен, чтобы при необходимости fork (например, для операций | или &). )

Если вам do необходимо запустить версии в bin, вы можете вызвать их по полному пути (например, /bin/pwd). (Это также обходит alias и т. П.) - Это редко полезно с bash, но если вы используете очень простую встроенную оболочку, например, busybox, это может быть полезно, поскольку их встроенные функции часто являются подмножествами функций.

1 голос
/ 13 декабря 2011

Встроенные оболочки, очевидно, более эффективны, чем отдельные двоичные файлы. Отдельные двоичные файлы полностью независимы и в основном предназначены для использования с другими оболочками, в которых эти встроенные функции отсутствуют. Вы можете заставить bash использовать двоичный файл, поместив команду в кавычки, IIRC. Если вы man bash, вы найдете достаточно информации о встроенных командах и о том, как именно они работают (это не всегда то же самое, что и внешние двоичные файлы).

1 голос
/ 13 декабря 2011

Чтобы ответить на ваш первый вопрос, я обнаружил, что если я набираю (в моей оболочке bash) «встроенный», а затем вкладку табуляции, он показывает мне список встроенных функций, так как он имеет завершение табуляции.Я знаю, что это лишь малая часть того, что вы спрашиваете, но это только начало, так как я не знаю всего, почему «почему».: P

...