Какие встроенные команды оболочки в 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
Ответ 6
http://ss64.com/bash/, это поможет вам.
и вот руководство по сценарию оболочки
http://www.freeos.com/guides/lsst/