Die Befehle, die in die Shell integriert sind, sind aufgrund der damit verbundenen Leistungssteigerung häufig integriert. Das Aufrufen des externen Geräts printf
ist beispielsweise langsamer als das Verwenden des integrierten Geräts printf
.
Da einige Dienstprogramme nicht brauchen in gebaut werden, es sei denn , sie sind speziell, wie cd
, werden sie auch als vorgesehen externe Dienstprogramme. Auf diese Weise werden Skripte nicht beschädigt, wenn sie von einer Shell interpretiert werden, die kein integriertes Äquivalent bietet.
Einige integrierte Shell-Funktionen bieten auch Erweiterungen für den externen äquivalenten Befehl. Bash's printf
zum Beispiel kann das
$ printf -v message 'Hello %s' "world"
$ echo "$message"
Hello world
(Drucken in eine Variable), was der Externe /usr/bin/printf
einfach nicht kann, da er in der aktuellen Shell-Sitzung keinen Zugriff auf die Shell-Variablen hat (und diese nicht ändern kann).
Eingebaute Dienstprogramme unterliegen auch nicht der Einschränkung, dass ihre erweiterte Befehlszeile kürzer als eine bestimmte Länge sein muss. Tun
printf '%s\n' *
ist daher sicher, wenn printf
ein Shell-Befehl eingebaut ist. Die Einschränkung der Länge der Befehlszeile ergibt sich aus der execve()
C-Bibliotheksfunktion, mit der ein externer Befehl ausgeführt wird. Wenn die Befehlszeile und die aktuelle Umgebung größer als ARG_MAX
Bytes sind (siehe getconf ARG_MAX
in der Shell), schlägt der Aufruf von execve()
fehl. Wenn das Dienstprogramm in die Shell integriert ist, execve()
muss es nicht aufgerufen werden.
Eingebaute Dienstprogramme haben Vorrang vor Dienstprogrammen in $PATH
. bash
Verwenden Sie zum Deaktivieren eines integrierten Befehls z
enable -n printf
Es ist eine kurze Liste von Utilities , dass Bedarf in eine Schale (aus dem POSIX - Standard ist genommen gebaut werden Liste der speziellen Einbauten )
break
colon (:)
continue
dot (.)
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset
Diese müssen integriert werden, da sie die Umgebung und den Programmablauf der aktuellen Shell-Sitzung direkt manipulieren. Ein externes Dienstprogramm wäre dazu nicht in der Lage.
Interessanterweise cd
ist nicht Teil dieser Liste, aber POSIX sagt dazu Folgendes :
Da sich dies cd
auf die aktuelle Shell-Ausführungsumgebung auswirkt, wird sie immer als reguläre integrierte Shell bereitgestellt. Wenn es in einer Subshell oder einer separaten Ausführungsumgebung für Dienstprogramme aufgerufen wird, z. B. in einer der folgenden Umgebungen:
(cd /tmp)
nohup cd
find . -exec cd {} \;
Dies hat keine Auswirkungen auf das Arbeitsverzeichnis der Anruferumgebung.
Ich gehe daher davon aus, dass die "speziellen" Einbauten keine externen Gegenstücke haben können, obwohl dies cd
theoretisch möglich wäre (aber es würde nicht sehr viel bewirken).