2010-07-07 2 views
13

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

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

+1

Это не имеет никакого отношения к ядру. –

ответ

12

Если вы хотите увидеть, как Баш встроенных команд будут определены то вам просто нужно посмотреть на Section 4 of The Bash Man Page.

Если, однако, вы хотите знать, как Баш bultins будут реализованы, вы должны смотреть на the Bash source code, потому что эти команды компилируются в Баш исполняемый файл.

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

3

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

1

A Shell builtin - 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 
+2

Не совсем верно - иногда встроенные и исполняемые файлы перекрываются, например. хотя есть программа '/ bin/echo', большинство оболочек предоставляют свои собственные 'echo' builtin. –

+0

еще один пример - это "время" –

11

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

  • Special built-in utilities, который должен быть встроен в систему, потому что у них есть какие-то особые свойства
  • Regular built-in utilities, которые почти всегда встроенные, из-за работы или других соображений
  • Любой стандарт полезности может быть также встроен, если хочет разработчик оболочки.

Вы можете узнать, будет ли построена утилита в использовании 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 использовал некоторые грязные системные взломы для выполнения своей работы.

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

2

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

Иногда встроенные функции встроены по соображениям производительности. В этом случае часто существует версия этой команды в $PATH (возможно, с другим набором функций, различным набором признанных аргументов командной строки и т. Д.), Но оболочка решила реализовать команду как встроенную, чтобы она могла сохраните работу, порожденную недолговечным процессом, чтобы выполнить какую-то работу, которую он мог бы сделать сам. Это имеет место для Баш и 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 является как оболочка встроенной (реализован как часть самой Баш), а также внешней команды (находится в/USR/бен/Printf). Обратите внимание, что они ведут себя по-другому - при вызове без аргументов встроенная версия и версия команды печатают разные сообщения об ошибках. Обратите внимание также, что опция -v var (сохранить результаты этого printf в переменную оболочки с именем var) может быть выполнена только как часть оболочки. Подпроцессы, такие как/usr/bin/printf, не имеют доступа к переменным оболочки, которая их выполняла.

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

Смежные вопросы