$ which echo
echo: shell built-in command.
$ which ls
/bin/ls
$ which cat
/bin/cat
Почему эхо не является независимой утилитой , как ls
, ps
, и cat
т.д.? Почему это специфическая оболочка? Есть веские причины?
$ which echo
echo: shell built-in command.
$ which ls
/bin/ls
$ which cat
/bin/cat
Почему эхо не является независимой утилитой , как ls
, ps
, и cat
т.д.? Почему это специфическая оболочка? Есть веские причины?
echo
безусловно , это является встроенной Bash. На самом деле, это встроенный в каждую большую современную оболочку.Ответы:
Существует два класса встроенных функций:
Некоторые команды должны быть встроены в саму программу оболочки, потому что они не могут работать, если они являются внешними.
cd
является одним из таких, поскольку, если бы он был внешним, он мог бы изменить только свой собственный каталог; это не могло повлиять на текущий рабочий каталог оболочки. (Смотрите также: Почему этоcd
не программа? )Другой класс команд встроен в оболочку исключительно для эффективности.
Страница людей имеет раздел встроенных команд , в котором упоминается , и в качестве примеров команд в этом классе.
dash
printf
echo
test
Системы Unix всегда включали отдельные исполняемые файлы для команд этого второго класса. Эти отдельные исполняемые файлы все еще доступны в каждой системе Unixy, которую я использовал, хотя они также встроены в каждую оболочку, которую вы, вероятно, будете использовать. ( POSIX фактически требует наличия этих исполняемых файлов.)
Я считаю,
echo
что встроен в оболочку в AT & T Unix System V Release 3.1. Я основываюсь на сравнении двух разных изданий руководств для систем Unix серии AT & Ts 3B1 . Кто-то любезно отсканировал издания этих руководств 1986 года и разместил их в Интернете ; они соответствуют оригинальной версии SVR3. Вы можете видеть, что этогоecho
нет в списке на странице 523 Руководства пользователя UNIX System V, том II , где вы ожидаете этого, если команда встроена в оболочку. В моей местной бумажной копии SVR3.1 пособий с 1987 года,echo
находится в списке в этом разделе руководства.Я почти уверен, что это не инновация Berkeley CSRG, которую AT & T вернула домой. 4.3BSD вышла в том же году, что и SVR3, 1986, но если вы посмотрите на man-страницу 4.3BSD sh.1 , вы увидите, что
echo
ее нет в списке встроенных команд раздела «Специальные команды». Если CSRG сделает это, то мы будем нуждаться в документированном источнике, чтобы это доказать.В этот момент вы можете задаться вопросом,
echo
был ли он встроен в оболочку раньше, чем SVR3.1, и что этот факт просто не был задокументирован до этого момента. Новейший исходный код Unix для AT & T до SVR3, доступный мне, находится в архиве PDP-11 System III , в котором вы найдете исходный код оболочки Bourne. Вы не найдетеecho
в встроенной таблице команд, которая находится в/usr/src/cmd/sh/msg.c
. Судя по меткам времени в этом файле, это доказывает, чтоecho
в 1980 году его точно не было в оболочке.пустяки
В том же каталоге также содержится файл с именем,
builtin.c
который не содержит ничего для этого вопроса, но мы находим этот интересный комментарий:источник
print
команда для ksh, которая, как говорят, ведет себя какecho
. Эта команда также присутствует в чем-то вроде AT & T Unix SVR4 2.1 i386 от ISC.print "\012"
дает тот же результат, что и эхо. Интересно, почему у ksh был print, а не echo встроенный? В любом случае действительно интересно.Существует третья причина, по которой некоторые команды должны быть встроены: их можно использовать, когда выполнение внешних команд невозможно.
Иногда система становится настолько сломанной, что
ls
команда не работает. В некоторых случаях, по-echo *
прежнему будет работать.Другой (более важный!) Пример
kill
: если в системе заканчиваются свободные идентификаторы PID, запуск невозможен/bin/kill
(потому что для этого требуется идентификатор PID :-), но встроенная системаkill
будет работать.Кстати,
which
это внешняя команда (по крайней мере, она не является внутренней в bash), поэтому она не может перечислить внутренние команды. Например:источник
ldconfig
не выпускайте, если вы точно не знаете, что делаете). Кроме того, что если вы удалите ваш / bin или, что еще хуже, раздел / sbin, но все равно загрузите оболочку?ps
команду, поэтому вам придется вручную найти PID/proc
.which
является псевдонимом bash, который работаетalias | /usr/bin/which --read-alias ...
так, что внешниеwhich
могут идентифицировать псевдонимы (но все же не встроенные). Я не могу решить, считать это гениальным или извращенным.Согласно справочнику Bash , речь идет об удобстве.
Scripting Guide Advanced Bash имеет более подробное объяснение:
Также обратите внимание, что
echo
в некоторых системах она существует как отдельная утилита. Вот что у меня есть в моей системе Darwin (MacOSX 10.5.8 - Leopard)echo
также доступен как встроенный, но, очевидно, мои скрипты используют / bin / echo на моем Mac и используют встроенный Bash на большинстве моих систем Linux и FreeBSD. Но это, похоже, не имеет значения, потому что сценарии по-прежнему работают хорошо везде.источник
type
.Чтобы дополнить ответ bhm, допустим, он
/bin
был случайно удален из вашегоPATH
. Вы бы хотелиecho $PATH
это выяснить, верно?источник
Несмотря на то, что большинство оболочек в
echo
настоящее время включают встроенные средства , GNU CoreUtils также включает в себя отдельную реализацию:Похоже, у вас не установлена GNU Coreutils (большинство ОС для настольных ПК и серверов на основе Linux устанавливают ее по умолчанию, но встроенный linux или другой UNIX могут использовать вместо этого альтернативные наборы утилит оболочки).
Кстати: если вы посмотрите на Busybox , вы увидите это
ls
,ps
аcat
также там есть встроенные команды (или, по крайней мере, они могут быть; они используются для встроенных систем, и все ненужное может быть опущено).источник
/bin/echo
которая не существует. Они просто показывают, что встроенное имеет приоритет над любойecho
программой в PATH.Вот настоящая причина, почему
echo
должна быть встроенная оболочка:Предположим, у вас есть пароль
$PASSWORD
. Как вы пишете это в файл./password
? Естественно, большинство программистов написали бы:Однако, если бы
echo
не встроенная оболочка, пароль передавался бы всем пользователям черезps
информацию.Конечно, если вы хотите проявить смекалку, вы можете найти способ сохранить пароль без использования
echo
, возможно, другой функции оболочки:Однако наличие
echo
встроенного является важным ремнем безопасности, так как наиболее очевидный способ сохранить пароль в файл также должен работать.источник