Eliah wykonał świetną robotę, odpowiadając na to pytanie, ale chcę skomentować część „dlaczego istnieje inna wersja echo
oddzielna od programu Bash”. To złe pytanie.
Prawidłowe pytanie brzmi: dlaczego jest to wbudowane przede wszystkim , skoro mogło to być (i jest) doskonale zewnętrzne polecenie?
Dla uproszczenia spójrz na wbudowane funkcje w myślniku, marne 38 (bash ma 61, dla porównania, przechodząc przez wynik 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
Ile z nich wymaga wbudowania? [
, echo
, false
, printf
, pwd
, test
, I true
nie trzeba być builtins: Nie wszystko, co tylko może rób wbudowane (wpływ lub uzyskanie stanu powłoki, która nie jest dostępna dla poleceń zewnętrznych). Bash korzysta printf
przynajmniej z wbudowanej funkcji: printf -v var
zapisuje dane wyjściowe do zmiennej var
. time
w bash jest również wyjątkowy: będąc słowem kluczowym, możesz mierzyć dowolne listy poleceń w bash (myślnik nie ma time
odpowiednika). pwd
nie musi też być wbudowany - każde polecenie zewnętrzne odziedziczy bieżący katalog roboczy (i to też polecenie zewnętrzne ).:
jest wyjątkiem - potrzebujesz NOP i tak :
jest. Reszta wykonuje czynności, które może łatwo wykonać polecenie zewnętrzne.
Tak więc jedna piąta wbudowanych nie musi być wbudowana. Dlaczego więc? Strona dash
man * wyjaśnia, dlaczego są one wbudowane (moje podkreślenie):
Wbudowane
W tej sekcji wymieniono wbudowane polecenia, które są wbudowane, ponieważ one
trzeba wykonać operację, której nie można wykonać osobno
proces. Oprócz nich istnieje kilka innych poleceń, które mogą
być wbudowanym w celu zwiększenia wydajności (np. printf (1), echo (1), test (1) itp.).
To wszystko: te wbudowane funkcje są dostępne, ponieważ są używane tak często, interaktywnie i w skryptach, a ich funkcjonalność jest na tyle prosta, że powłoka może wykonać zadanie. I tak to się dzieje: niektóre (większość?) Muszle wziął w pracy ** wracać. Od 2,9 BSD i nie znajdzie polecenie wbudowane.sh
echo
Jest więc całkiem możliwe, że minimalna powłoka może pominąć implementację takich poleceń jak wbudowane (nie sądzę jednak, że jakakolwiek obecna powłoka to robi). Projekt GNU coreutils nie zakłada, że będziesz je uruchamiał w określonej powłoce, a POSIX wymaga tych poleceń. Coreutils i tak je zapewnia i pomija te, które nie mają żadnego znaczenia poza powłoką.
* Jest to prawie identyczne z odpowiadającym mu tekstem strony podręcznej dla powłoki Almquist , na której opiera się dash, powłoka Almquist Debiana.
** doprowadza zsh
ten pomysł do skrajności: polecenia, które dostajesz, ładując różne moduły zmv
, są rzeczami, o których nie pomyślałbyś, że powłoka powinna się w to wniknąć . W tym momencie prawdziwe pytanie brzmi: dlaczego miałbyś używać bash zamiast zsh, który ma wszystkie te wbudowane funkcje?