Элия отлично поработал, ответив на это, но я хочу прокомментировать часть «почему существует другая версия, echo
отдельная от программы Bash». Это неправильный вопрос.
Правильный вопрос: почему это встроенное в первую очередь , когда оно могло быть (и является) совершенно хорошей внешней командой?
Для простоты взгляните на встроенные в dash, жалкие 38 (bash имеет 61, для сравнения, исходя из вывода compgen -b
):
. continue getopts readonly type
: echo hash return ulimit
[ eval jobs set umask
alias exec kill shift unalias
bg exit local test unset
break export printf times wait
cd false pwd trap
command fg read true
Сколько из них должно быть встроено? [
, echo
, false
, printf
, pwd
, test
, И true
не нужно быть встроенными функциями : Они все , что только может сделать встроенный (аффект или получить оболочки состояния, не доступна для внешних команд) не делать. Bash printf
по крайней мере использует преимущества встроенности: printf -v var
сохраняет выходные данные в переменную var
. time
в bash также особенное: будучи ключевым словом, вы можете синхронизировать произвольные списки команд в bash (у dash нет time
эквивалента). pwd
Не обязательно быть встроенным - любая внешняя команда наследует текущий рабочий каталог (и это тоже внешняя команда ).:
это исключение - вам нужен NOP, и :
это так. Остальные выполняют действия, которые легко может выполнить внешняя команда.
Таким образом, пятая часть этих встроенных функций не должна быть встроенной. Тогда почему? Страница dash
man * на самом деле объясняет, почему это встроенные (выделено мое):
Встроенные команды
В этом разделе перечислены встроенные команды, которые встроены, потому что они
необходимо выполнить некоторые операции, которые не могут быть выполнены отдельным
процесс. В дополнение к этому есть несколько других команд, которые могут
быть встроенным для эффективности (например, printf (1), echo (1), test (1) и т. д.).
Вот и все: эти встроенные функции существуют потому, что они используются так часто, в интерактивном режиме и в сценариях, а их функциональные возможности достаточно просты, чтобы оболочка могла выполнять свою работу. И так бывает: некоторые (?) Большинство снарядов взяли на работу ** Вернуться к. Из 2.9 BSD , и вы не найдете встроенную команду.sh
echo
Таким образом, вполне возможно, что минимальная оболочка может пропустить реализацию таких команд, как встроенные (хотя я не думаю, что какая-либо текущая оболочка это делает). Проект GNU coreutils не предполагает, что вы собираетесь запускать их в определенной оболочке, а POSIX требует этих команд. Итак, coreutils предоставляет их в любом случае и пропускает те, которые не имеют никакого значения вне оболочки.
* Это почти идентично соответствующему тексту man-страницы для оболочки Almquist , на которой основана черта, оболочка Debian Almquist.
** zsh
доводит эту идею до крайности: команды, которые вы получаете, загружая различные модули, например zmv
, являются вещами , в которые вы даже не думаете, что оболочка даже не нуждается . В этот момент реальный вопрос: зачем вам использовать bash вместо zsh, в котором есть все эти встроенные функции?