Елія зробив чудову роботу, щоб відповісти на це, але я хочу прокоментувати echo
частину "чому існує інша версія окремої програми Bash". Це неправильне питання.
Правильне питання: чому це вбудований в першу чергу , коли він міг бути (і є) ідеально чудовою зовнішньою командою?
Для простоти погляньте на вбудовані тире, потворний 38 (баш має 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
НЕ потрібно бути вбудованими функціями : Вони все , що тільки може зробити вбудований не робити (афект або отримати стан оболонки, недоступна для зовнішніх команд). printf
Принаймні, Баш використовує перевагу вбудованості: printf -v var
економить вихідну змінну var
. time
в bash також є особливим: будучи ключовим словом, ви можете розміщувати довільні списки команд у bash (тире не має time
еквівалента). pwd
також не повинно бути вбудованим - будь-яка зовнішня команда буде успадковувати поточну робочу директорію (і це також зовнішня команда ).:
є винятком - вам потрібен НОП, і :
це. Решта виконують дії, які зовнішня команда може легко виконати.
Отже, п'яту частину цих вбудованих не потрібно вбудовувати. Чому ж тоді? Сторінка керівництва * на насправді пояснює мимохідь , чому це (увага вбудовані функції шахтні):dash
Вбудовані
У цьому розділі перелічені вбудовані команди, які вбудовані, оскільки вони
потрібно виконати деяку операцію, яку не можна виконати окремим
процес. На додаток до них, можливо , є ще кілька команд
бути вбудованим для ефективності (наприклад, printf (1), echo (1), test (1) тощо).
Це майже все: ці вбудовані елементи існують, тому що вони використовуються так часто, інтерактивно та в сценаріях, а їх функціональність досить проста, що оболонка може виконати роботу. І так буває: деякі (?) Більшість снарядів взяли на роботу ** Поверніться. З 2.9 BSD , і ви не знайдете вбудовану команду.sh
echo
Таким чином, цілком можливо, що мінімальна оболонка може пропустити реалізацію таких команд, як вбудовані (я не думаю, що жодна поточна оболонка робить). Проект coreutils GNU не передбачає, що ви збираєтеся запускати їх у певній оболонці, а POSIX вимагає цих команд. Отже, coreutils надає це все-таки і пропускає ті, які не мають жодного значення поза оболонкою.
* Це майже ідентично відповідному тексту сторінки для оболонки Almquist , на чому базується тире, оболонка Dex Almquist.
** zsh
доводить цю ідею до кінця: команди, які ви отримуєте, завантажуючи різні модулі, наприклад zmv
, - це речі, до яких ви б не думали, що оболонці навіть не потрібно потрапляти . Тоді справжнє питання: чому б ви використовували bash замість zsh, який має всі ці вбудовані?