Почему эхо-оболочка встроена в команду?

$ which echo
echo: shell built-in command.
$ which ls
/bin/ls
$ which cat
/bin/cat

Почему echo не является независимой утилитой вроде ls, ps, cat и т. д.? Почему это оболочка? Любые веские причины?

33 голоса | спросил Lazer 29 AM000000110000005831 2010, 11:33:58

5 ответов


69

Существует два класса встроенных функций:

  1. Некоторые команды должны быть встроены в программу оболочки, потому что они не могут работать, если они являются внешними.

    cd является одним из таких, поскольку, если он был внешним, он мог только изменить свой собственный каталог; он не может повлиять на текущий рабочий каталог оболочки. (См. Также: Почему cd не программа? )

  2. Другой класс команд встроен в оболочку исключительно для эффективности.

    dash справочная страница содержит раздел о встроенных компонентах, в котором упоминается printf, echo и test в качестве примеров команд этого класса.

Unix-системы всегда включали отдельные исполняемые файлы для команд этого второго класса. Эти отдельные исполняемые файлы по-прежнему доступны для каждой системы Unixy, которую я использовал, даже если они также встроены в каждую оболочку, которую вы, вероятно, будете использовать. ( POSIX действительно требует присутствия этих исполняемых файлов.)

Я верю, что echo был встроен в оболочку в AT & T Unix System V Release 3.1. Я основываю это на сравнении двух разных выпусков руководств для AT & Ts систем Unix Unix 3B1 . Кто-то любезно просмотрел издания 1986 года этих руководств и разместил их в Интернете ; они соответствуют первоначальному выпуску SVR3. Вы можете видеть, что echo отсутствует в списке на стр. 523 из Руководство пользователя UNIX System V, том II , где вы ожидаете, если команда будет встроена в оболочку. В моей местной бумажной копии руководств SVR3.1 с 1987 года echo is , перечисленных в этом разделе руководство.

Я почти уверен, что это не инновация Berkeley CSRG , которую AT & T принес домой. 4.3BSD вышел в том же году, что и SVR3, 1986, но если вы посмотрите путевая страница sh.1 4.3BSD , вы видите, что echo не находится в раздел «Специальные команды» в списке встроенных команд. Если CSRG сделал это, это оставит нас желать документально подтвержденного источника, чтобы доказать это.

В этот момент вы можете задаться вопросом, был ли echo встроен в оболочку раньше SVR3.1 и что этот факт просто wasn ' t задокументировано до тех пор. Самый новый исходный код pre-SVR3 AT & T Unix, доступный мне, находится в папке PDP-11 System III tarball , в котором вы найдете исходный код оболочки Bourne. Вы не найдете echo во встроенной таблице команд, которая находится в /usr/src/cmd/sh/msg.c. Основываясь на отметках времени в этом файле, это доказывает, что echo, конечно, не было в оболочке в 1980 году.


Общая информация

В том же каталоге также содержится файл с именем builtin.c, который не содержит ничего для этого вопроса, но мы находим этот интересный комментарий:

 /*      
    builtin commands are those that Bourne did not intend
    to be part of his shell.
    Redirection of i/o, or rather the lack of it, is still a
    problem..
*/      
ответил Warren Young 29 PM00000020000003431 2010, 14:32:34
18

Существует третья причина для того, чтобы некоторые команды были встроены: их можно использовать, когда выполнение внешних команд невозможно.

Иногда система становится настолько разбитой, что команда ls не работает. В некоторых случаях код echo * будет работать.

Другим (более важным!) примером является kill: если в системе заканчиваются бесплатные PID, невозможно запустить ---- +: = 3 =: + ---- (потому что ему нужен PID :-), но встроенный /bin/kill будет работать.

Btw., kill - это внешняя команда (по крайней мере, она не является внутренней в bash), поэтому она не может отображать внутренние команды. Например:

which
ответил bhm 23 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 23 Sep 2010 01:51:50 +0400 2010, 01:51:50
6

Чтобы дополнить ответ bhm, скажем, /bin был случайно удален из вашего ---- +: = 1 =: + ----. Вы хотите иметь возможность PATH, чтобы узнать это, правильно?

ответил Daniel Hershcovich 20 +04002011-10-20T14:49:28+04:00312011bEurope/MoscowThu, 20 Oct 2011 14:49:28 +0400 2011, 14:49:28
2

Хотя большинство оболочек включают в себя встроенный echo в настоящее время, GNU CoreUtils также включает в себя автономную реализацию:

$ which echo
/bin/echo
$ dpkg -S /bin/echo
coreutils: /bin/echo

Похоже, что у вас нет GNU Coreutils (большинство Linux-серверов и серверных ОС установлены по умолчанию, но встроенный Linux или другой UNIX могут вместо этого использовать альтернативные коллекции утилит).

BTW: если вы посмотрите Busybox , вы увидите, что ls, ps и cat также являются встроенными командами (или, по крайней мере, могут быть: они используются для встроенных систем, и все, что не нужно, может быть опущено).

ответил JanC 30 PM00000050000002431 2010, 17:29:24
1

Вот настоящая причина, почему echo должен быть встроенной оболочкой:

Предположим, что у вас есть пароль в $PASSWORD. Как вы пишете его в файл ./password? Естественно, большинство программистов напишут:

echo "$PASSWORD" >./password

Однако, если echo не были встроены в оболочку, пароль будет протекать для всех пользователей через ps.

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

cat >./password <<EOF
${PASSWORD}
EOF

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

ответил DepressedDaniel 19 FebruaryEurope/MoscowbSun, 19 Feb 2017 08:20:25 +0300000000amSun, 19 Feb 2017 08:20:25 +030017 2017, 08:20:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132