Какие встроенные команды оболочки в Linux?

Я только начал использовать Linux, и мне любопытно, как определяются встроенные команды оболочки, такие как cd.

Кроме того, я был бы признателен, если бы кто-нибудь мог объяснить, как они реализованы и выполнены.

Ответы

Ответ 1

Если вы хотите увидеть, как bash встроенные функции определены, вам просто нужно посмотреть Раздел 4 раздела bash Страница человека.

Если вам нужно знать, как bash bultins реализовано, вам нужно посмотреть bash исходный код, поскольку эти команды скомпилированы в исполняемый файл bash.

Один быстрый и простой способ увидеть, является ли команда встроенным bash, использовать команду help. Пример. help cd покажет вам, как определяется bash встроенный в 'cd'. Аналогично для help echo.

Ответ 2

Фактический набор встроенных модулей зависит от оболочки и оболочки. Есть:

Вы можете узнать, построена ли утилита с помощью команды type, которая поддерживается большинством оболочек (хотя ее вывод не стандартизован). Пример из dash:

$ type ls
ls is /bin/ls
$ type cd
cd is a shell builtin
$ type exit
exit is a special shell builtin

Re cd, теоретически там ничего не мешает реализатору оболочки реализовать его как внешнюю команду. cd не может напрямую изменить текущий каталог оболочки, но, например, cd может связывать новый каталог с процессом оболочки через сокет. Но никто этого не делает, потому что нет смысла. За исключением очень старых оболочек (где не было понятия встроенных модулей), где cd использовал какой-то грязный системный хак для выполнения своей работы.

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

Ответ 3

Manjari, Проверьте исходный код оболочки bash с ftp://ftp.gnu.org/gnu/bash/bash-2.05b.tar.gz Вы обнаружите, что определение встроенных команд оболочки не в отдельном бинарном исполняемом файле, а в самом внутреннем двоичном файле оболочки (встроенная оболочка имени явно указывает на это).

Ответ 4

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

Иногда встроенные функции встроены по соображениям производительности. В этом случае часто существует версия этой команды в $PATH (возможно, с другим набором функций, другим набором признанных аргументов командной строки и т.д.), Но оболочка решила реализовать команду как встроенную, так что он мог бы спасти работу от нерегулярного процесса, чтобы сделать какую-то работу, которую он мог бы сделать сам. Это случай для bash и printf, например:

$ type printf
printf is a shell builtin
$ which printf
/usr/bin/printf
$ printf
printf: usage: printf [-v var] format [arguments]
$ /usr/bin/printf
/usr/bin/printf: missing operand
Try `/usr/bin/printf --help' for more information.

Обратите внимание, что в приведенном выше примере printf является встроенной оболочкой (реализованной как часть самого bash), а также внешней командой (расположенной в /usr/bin/printf ). Обратите внимание, что они ведут себя по-другому - при вызове без аргументов встроенная версия и версия команды печатают разные сообщения об ошибках. Также обратите внимание, что опция -v var (сохранить результаты этого printf в переменную оболочки с именем var) может выполняться только как часть оболочки. Подпроцессы, такие как /usr/bin/printf, не имеют доступа к переменным оболочки которые их выполнили.

И это приводит нас к второй части истории: некоторые команды встроены, потому что они должны быть. Некоторые команды, такие как chmod, представляют собой тонкие оболочки вокруг системных вызовов. Когда вы запускаете /bin/chmod 777 foo, forks, execs/bin/chmod (передача "777" и "foo" ) в качестве аргументов, а новый процесс chmod запускает код C chmod("foo", 777);, а затем возвращает управление оболочке. Однако это не сработало бы для команды cd. Даже если cd выглядит как тот же случай, что и chmod, он должен вести себя по-другому: если оболочка породила другой процесс для выполнения системного вызова chdir, он изменил бы каталог только для этого вновь созданного процесса, а не оболочка. Затем, когда процесс вернется, оболочка останется сидеть в том же каталоге, что и раньше, поэтому cd должен быть реализован как встроенная оболочка.

Ответ 5

Встроенная оболочка - http://linux.about.com/library/cmd/blcmdl1_builtin.htm например. -

which cd 
/usr/bin/which: no cd in (/usr/bin:/usr/local/bin......

Не встроенная оболочка, а двоичная.

which ls
/bin/ls