Eliah hat das sehr gut beantwortet, aber ich möchte einen Kommentar zum Teil "Warum gibt es eine andere Version von echo
getrennt vom Bash-Programm?" Abgeben. Das ist die falsche Frage.
Die richtige Frage ist: Warum ist dies überhaupt ein eingebautes Kommando, wenn es ein perfektes externes Kommando gewesen sein könnte (und ist)?
Werfen Sie der Einfachheit halber einen Blick auf die Builtins in dash, a measly 38 (bash hat zum Vergleich 61, basierend auf der Ausgabe von 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
Wie viele davon müssen eingebaut werden? [
, echo
, false
, printf
, pwd
, test
, Und true
nicht braucht builtins zu sein: Sie tun nichts , die nur ein builtin tun kann (beeinflussen oder Shell - Zustand erhalten, die auf externe Befehle nicht verfügbar ist). Bashs printf
nutzt zumindest den Vorteil, dass es ein integriertes Element ist: printf -v var
Speichert die Ausgabe in der Variablen var
. time
in bash ist auch etwas Besonderes: Indem Sie ein Schlüsselwort sind, können Sie beliebige Befehlslisten in bash zeitlich festlegen (Bindestrich hat kein time
Äquivalent). pwd
Es muss auch kein integrierter Befehl sein - jeder externe Befehl erbt das aktuelle Arbeitsverzeichnis (und es ist auch ein externer Befehl ).:
ist eine Ausnahme - Sie brauchen eine NOP, und :
ist es. Der Rest führt Aktionen aus, die ein externer Befehl problemlos ausführen kann.
Ein Fünftel dieser Buildins müssen also keine Buildins sein. Warum dann? Die dash
Manpage * erklärt im Nachhinein, warum es sich um Builtins handelt (Schwerpunkt Mine):
Builtins
Dieser Abschnitt listet die eingebauten Befehle auf, die aufgrund ihrer Eigenschaften eingebaut sind
Sie müssen einen Vorgang ausführen, der nicht von einem anderen ausgeführt werden kann
Prozess. Zusätzlich zu diesen gibt es möglicherweise mehrere andere Befehle
Aus Effizienzgründen eingebaut sein (z. B. printf (1), echo (1), test (1) usw.).
Das ist so ziemlich alles: Diese integrierten Funktionen sind vorhanden, weil sie so häufig, interaktiv und in Skripten verwendet werden und ihre Funktionalität so einfach ist, dass die Shell die Aufgabe übernehmen kann. Und so geschieht es: einige (? Die meisten) Muscheln auf dem Job nahm ** gehen. Diesh
von 2.9 BSD , und Sie werden keine finden echo
builtin.
Es ist also durchaus möglich, dass eine minimale Shell die Implementierung von Befehlen wie builtins überspringt (ich glaube jedoch, dass dies bei keiner aktuellen Shell der Fall ist). Das GNU-Coreutils-Projekt geht nicht davon aus, dass Sie sie in einer bestimmten Shell ausführen werden, und POSIX benötigt diese Befehle. Coreutils stellt diese also trotzdem zur Verfügung und überspringt diejenigen, die außerhalb der Shell keine Bedeutung haben.
* Dies ist fast identisch mit dem entsprechenden Manpage-Text für die Almquist-Shell , auf der dash, die Debian-Almquist-Shell, basiert.
** zsh
bringt diese Idee auf das Äußerste: Die Befehle, die Sie beim Laden verschiedener Module erhalten zmv
, sind Dinge, von denen Sie nicht glauben, dass sie für eine Shell überhaupt erforderlich sind . Zu diesem Zeitpunkt lautet die eigentliche Frage: Warum sollten Sie bash anstelle von zsh verwenden, das all diese eingebauten Funktionen hat?