Eliah сделала отличную работу, чтобы ответить на это, но я хочу прокомментировать «почему есть другая версия echo
, отдельно от части программы Bash». Это неправильный вопрос.
Правильный вопрос: почему это встроено в первую очередь , когда это могло бы быть ( и есть) прекрасная внешняя команда?
Для простоты взгляните на встроенные элементы в тире, 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
не нуждаются , чтобы быть встроенными: они не делают ничего, что только встроенный может (влиять или получать состояние оболочки, недоступное внешним командам). % Of_de% Bash, по крайней мере, использует встроенную функцию: printf
сохраняет результат переменной printf -v var
. var
в bash также является особенным: если вы являетесь ключевым словом, вы можете использовать произвольные списки команд в bash (тире нет эквивалента time
). time
не обязательно должно быть встроенным: любая внешняя команда наследует текущий рабочий каталог (и это внешняя команда ). pwd
- исключение - вам нужен NOP, а :
- это. Остальные делают действия, которые может легко выполнить внешняя команда.
Итак, пятая часть этих встроенных функций не должна быть встроена. Тогда почему? :
manpage * фактически объясняет, почему это встроенные функции (выделение мой):
Builtins
This section lists the builtin commands which are builtin because they
need to perform some operation that can't be performed by a separate
process. In addition to these, there are several other commands that may
be builtin for efficiency (e.g. printf(1), echo(1), test(1), etc).
Это в значительной степени: эти встроенные функции существуют потому, что они используются так часто, интерактивно и в скриптах, и их функциональность достаточно проста, что оболочка может выполнять эту работу. И так происходит: некоторые (большинство?) Оболочек взяли на себя работу. ** Вернитесь к dash
из 2.9 BSD , и вы не найдете sh
builtin.
Итак, вполне возможно, что минимальная оболочка может пропустить реализацию таких команд, как встроенные (я не думаю, что какая-либо текущая оболочка делает). Проект GNU coreutils не предполагает, что вы собираетесь запускать их в определенной оболочке, а POSIX требует этих команд. Таким образом, coreutils предоставляет все это и пропускает те, которые не имеют никакого значения вне оболочки.
* Это почти идентично соответствующий текст man-страницы для оболочки Almquist , в основе которой лежит дешифрование оболочки Debian Almquist.
** echo
доводит эту идею до крайности: команды, которые вы получаете, загружая различные модули, например zsh
, - это то, о чем вы бы не подумали, что оболочка нуждается даже в работе . В этот момент возникает реальный вопрос: зачем вы используете bash вместо zsh, который имеет все эти встроенные функции?