Im Bash-Handbuch steht das geschrieben
Builtin commands are contained >>> within <<< the shell itself
Auch diese Antwort besagt, dass
A built-in command is simply a command that the shell carries out itself,
instead of interpreting it as a request to load and run some
>>> other program <<<
Wenn ich laufe compgen -b
auf bash 4.4
, erhalte ich eine Liste aller Shell - builtin - Befehle. Ich sehe das zum Beispiel [
und bin kill
als Shell Builtins aufgeführt. Aber ihre tatsächlichen Standorte sind:
/usr/bin/[
/bin/kill
Ich dachte, dass dies builtin
bedeutet, dass der Befehl in die /bin/bash
ausführbare Datei kompiliert wird . Was mich also wirklich verwirrt: Bitte korrigieren Sie mich, aber wie kann ein separater Befehl ein sein builtin
, wenn er tatsächlich nicht Teil der Shell ist?
bash
shell
shell-builtin
Manifestator
quelle
quelle
exec
zum Bearbeiten von Dateideskriptoren undeval
zum Auswerten von Befehlen. Sie werden nicht als eigenständige Befehle benötigtAntworten:
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ätsprintf
.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(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
ist daher sicher, wenn
printf
ein Shell-Befehl eingebaut ist. Die Einschränkung der Länge der Befehlszeile ergibt sich aus derexecve()
C-Bibliotheksfunktion, mit der ein externer Befehl ausgeführt wird. Wenn die Befehlszeile und die aktuelle Umgebung größer alsARG_MAX
Bytes sind (siehegetconf ARG_MAX
in der Shell), schlägt der Aufruf vonexecve()
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 zEs ist eine kurze Liste von Utilities , dass Bedarf in eine Schale (aus dem POSIX - Standard ist genommen gebaut werden Liste der speziellen Einbauten )
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 :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).quelle
chdir
/cd
waren externe Binärdateien in sehr frühen Unices / Pre-Unix, bevor siefork
eingeführt wurden./usr/bin/cd
, aber es wird nicht das aktuelle Arbeitsverzeichnis ändern. Das Handbuch besagt:/usr/bin/cd
Hat keine Auswirkung auf den Aufrufvorgang, kann jedoch verwendet werden, um zu bestimmen, ob ein bestimmtes Verzeichnis als aktuelles Verzeichnis festgelegt werden kann oder nicht.kill
ist auch gut, weil es keinen weiteren Prozess verzweigen muss. Gut, wenn Sie das Limit für die Anzahl der Prozesse erreicht haben.Sie sind (sehr verständlich) verwirrt darüber, dass einige integrierte Funktionen sowohl als integrierte als auch als externe Befehle vorhanden sind. Wenn Sie also Recht haben, dass es beispielsweise einen
/bin/[
Befehl gibt, bedeutet dies nicht, dass sich der "tatsächliche Standort" darin befindet/bin
.Eine einfache Möglichkeit, dies zu testen, besteht darin,
type
mit dem-a
Schalter zu arbeiten, der alle verfügbaren Instanzen eines Befehls anzeigt. Auf meinem Arch-System zeigt das:Beachten Sie, dass
/sbin
,/usr/sbin
und/bin
sind alle Symlinks zeigen auf/usr/bin
, so dass es nur eine externe ist[
:Wie Sie sehen können,
[
handelt es sich sowohl um einen eingebauten als auch um einen externen Befehl, und das Gleiche gilt für verschiedene andere eingebaute Shell-Befehle. Dies ändert jedoch nichts an der Tatsache, dass es sich auch um Shell-Builds handelt, die in die Shell selbst kompiliert wurden.quelle
/bin/printf
vomcoreutils
Paket und/bin/kill
von installiertutil-linux
.