Polecenia wbudowane w powłokę są często wbudowane ze względu na wzrost wydajności, jaki to daje. Na przykład wywołanie zewnętrznego printf
jest wolniejsze niż użycie wbudowanego printf
.
Ponieważ niektóre narzędzia nie muszą być wbudowane, chyba że są wyjątkowe, na przykład cd
są również dostarczane jako narzędzia zewnętrzne . Dzieje się tak, aby skrypty nie uległy awarii, jeśli są interpretowane przez powłokę, która nie zapewnia wbudowanego odpowiednika.
Niektóre wbudowane powłoki dostarczają również rozszerzenia zewnętrznego równoważnego polecenia. Na printf
przykład Bash's jest w stanie to zrobić
$ printf -v message 'Hello %s' "world"
$ echo "$message"
Hello world
(wypisz do zmiennej), czego zewnętrzny /usr/bin/printf
po prostu nie byłby w stanie zrobić, ponieważ nie ma dostępu do zmiennych powłoki w bieżącej sesji powłoki (i nie może ich zmienić).
Wbudowane narzędzia również nie mają ograniczenia, że ich rozszerzona linia poleceń musi być krótsza niż pewna długość. Robić
printf '%s\n' *
jest zatem bezpieczny, jeśli printf
jest wbudowanym poleceniem powłoki. Ograniczenie długości wiersza poleceń wynika z execve()
funkcji biblioteki C używanej do wykonania polecenia zewnętrznego. Jeśli linia poleceń i bieżące środowisko jest większe niż ARG_MAX
bajty (patrz getconf ARG_MAX
w powłoce), wywołanie do execve()
nie powiedzie się. Jeśli narzędzie jest wbudowane w powłokę, execve()
nie musi być wywoływane.
Wbudowane narzędzia mają pierwszeństwo przed narzędziami znalezionymi w $PATH
. Aby wyłączyć wbudowane polecenie w bash
, użyj np
enable -n printf
Istnieje krótka lista narzędzi, które muszą zostać wbudowane w powłokę (wzięte z listy specjalnych wbudowanych w standardzie POSIX )
break
colon (:)
continue
dot (.)
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset
Należy je wbudować, ponieważ bezpośrednio manipulują środowiskiem i przepływem programu bieżącej sesji powłoki. Zewnętrzne narzędzie nie byłoby w stanie tego zrobić.
Co ciekawe, cd
nie jest częścią tej listy, ale POSIX mówi o tym:
Ponieważ cd
wpływa na bieżące środowisko wykonywania powłoki, zawsze jest dostarczane jako zwykła wbudowana powłoka. Jeśli jest wywoływany w podpowłoce lub w oddzielnym środowisku wykonywania narzędzia, takim jak jedno z następujących:
(cd /tmp)
nohup cd
find . -exec cd {} \;
nie wpływa na katalog roboczy środowiska dzwoniącego.
W związku z tym zakładam, że „specjalne” wbudowane elementy nie mogą mieć zewnętrznych odpowiedników, podczas gdy cd
teoretycznie mogłyby mieć (ale niewiele by to zrobiły).