$ which echo
echo: shell built-in command.
$ which ls
/bin/ls
$ which cat
/bin/cat
Warum ist Echo kein unabhängiges Dienstprogramm wie ls
, ps
, cat
etc? Warum ist es Shell-spezifisch? Irgendwelche guten Gründe?
shell
command-line
shell-builtin
Laser
quelle
quelle
echo
sicher ist ein Bash eingebaut. Tatsächlich ist es in jede wichtige moderne Hülle eingebaut.Antworten:
Es gibt zwei Klassen von Buildins:
Einige Befehle müssen in das Shell-Programm selbst eingebaut werden, da sie nicht funktionieren, wenn sie extern sind.
cd
ist eines davon, da es, wenn es extern wäre, nur sein eigenes Verzeichnis ändern könnte; es konnte sich nicht auf das aktuelle Arbeitsverzeichnis der Shell auswirken. (Siehe auch: Warum istcd
kein Programm? )Die andere Klasse von Befehlen ist nur aus Effizienzgründen in die Shell integriert.
Der Mann Seite hat einen Abschnitt über builtins , die erwähnt , und als Beispiele für Befehle in dieser Klasse.
dash
printf
echo
test
Unix-Systeme haben immer separate ausführbare Dateien für Befehle in dieser zweiten Klasse enthalten. Diese separaten ausführbaren Dateien sind weiterhin auf jedem von mir verwendeten Unixy-System verfügbar, obwohl sie auch in jede Shell integriert sind, die Sie wahrscheinlich verwenden. (Für POSIX müssen diese ausführbaren Dateien vorhanden sein.)
Ich glaube
echo
, dass die Shell in AT & T Unix System V Release 3.1 eingebaut wurde. Ich stütze mich darauf, dass zwei verschiedene Ausgaben von Handbüchern für Unix-Systeme der AT & Ts 3B1-Serie verglichen werden . Jemand hat freundlicherweise 1986 Ausgaben dieser Handbücher gescannt und online gestellt . diese entsprechen der Originalversion von SVR3. Sie können sehen, dass diesecho
nicht in der Liste auf Seite 523 des UNIX System V-Benutzerhandbuchs, Band II , aufgeführt ist, wo Sie es erwarten würden, wenn der Befehl in die Shell integriert wäre. In meiner lokalen Papierkopie des SVR3.1 Handbücher von 1987,echo
wird in diesem Abschnitt des Handbuch aufgeführt.Ich bin mir ziemlich sicher, dass dies keine Innovation von Berkeley CSRG ist , die AT & T nach Hause gebracht hat. 4.3BSD erschien im selben Jahr wie SVR3, 1986, aber wenn Sie sich die sh.1-Manpage von 4.3BSD ansehen , sehen Sie, dass diese
echo
nicht in der Liste der eingebauten Befehle im Abschnitt "Spezielle Befehle" enthalten ist. Wenn CSRG dies getan hat, möchten wir eine dokumentierte Quelle, um dies zu beweisen.An diesem Punkt werden Sie sich vielleicht fragen, ob
echo
die Shell früher als SVR3.1 eingebaut wurde und ob diese Tatsache bis dahin einfach nicht dokumentiert war. Der neueste für mich verfügbare Pre-SVR3 AT & T Unix-Quellcode befindet sich im PDP-11 System III-Tarball , in dem sich der Bourne-Shell-Quellcode befindet. Sie werden es nichtecho
in der eingebauten Befehlstabelle finden, die sich in befindet/usr/src/cmd/sh/msg.c
. Basierend auf den Zeitstempeln in dieser Datei beweist dies, dassecho
es 1980 mit Sicherheit keine Shell gab.Trivia
Das gleiche Verzeichnis enthält auch eine Datei mit dem Namen,
builtin.c
die für diese Frage keine Informationen enthält, aber wir finden diesen interessanten Kommentar:quelle
print
Befehl für ksh, der sich wie folgt verhältecho
. Dieser Befehl ist auch in so etwas wie AT & T Unix SVR4 2.1 i386 von ISC enthalten.print "\012"
liefert das gleiche Ergebnis wie Echo. Frage mich, warum ksh Print und kein Echo eingebaut hatte? Jedenfalls sehr interessant.Es gibt einen dritten Grund für die Integration einiger Befehle: Sie können verwendet werden, wenn die Ausführung externer Befehle nicht möglich ist.
Manchmal ist ein System so kaputt, dass der
ls
Befehl nicht funktioniert. In einigen Fällenecho *
funktioniert ein noch.Ein weiteres (wichtigeres!) Beispiel ist
kill
: Wenn ein System keine freien PIDs mehr hat, kann es nicht ausgeführt werden/bin/kill
(weil es eine PID benötigt :-), aber das eingebautekill
funktioniert.Übrigens
which
handelt es sich um einen externen Befehl (zumindest nicht um einen internen Befehl in der Bash), sodass keine internen Befehle aufgelistet werden können. Zum Beispiel:quelle
ldconfig
Geben Sie NIE aus, wenn Sie nicht genau wissen, was Sie tun). Und was ist, wenn Sie Ihre / bin-Partition oder, schlimmer noch, Ihre / sbin-Partition wegpusten, aber noch eine Shell geladen haben?ps
Befehl ausführen , daher müssen Sie die PIDs manuell über suchen/proc
.which
ist ein Bash - Alias , dass läuftalias | /usr/bin/which --read-alias ...
so das externewhich
können Aliase identifizieren (aber noch nicht fest eingebauten Funktionen). Ich kann mich nicht entscheiden, ob ich das für brillant oder pervers halte.Nach dem Bash-Referenzhandbuch geht es um Bequemlichkeit.
Das Advanced Bash Scripting Guide enthält eine detailliertere Erklärung:
Beachten Sie auch, dass
echo
es auf einigen Systemen ein eigenständiges Dienstprogramm gibt. Folgendes habe ich auf meinem Darwin-System (MacOSX 10.5.8 - Leopard)echo
ist auch als integrierte Version verfügbar, aber anscheinend verwenden meine Skripte / bin / echo auf meinem Mac und verwenden eine integrierte Bash-Version auf den meisten meiner Linux- und FreeBSD-Systeme. Aber das scheint keine Rolle zu spielen, da die Skripte immer noch überall gut funktionieren.quelle
type
.Um die Antwort von bhm zu ergänzen, nehmen wir an, Sie
/bin
wurden versehentlich von Ihrer entferntPATH
. Sie möchtenecho $PATH
das herausfinden können, oder?quelle
Obwohl die meisten Shells
echo
heutzutage ein eingebautes enthalten , enthalten die GNU CoreUtils auch eine eigenständige Implementierung davon:Es hört sich so an, als hätten Sie GNU Coreutils nicht installiert (die meisten Linux-basierten Desktop- und Server-Betriebssysteme haben es standardmäßig installiert, aber eingebettetes Linux oder anderes UNIX könnte stattdessen alternative Sammlungen von Shell-Dienstprogrammen verwenden).
BTW: Wenn man sich anschaut , Busybox , sehen Sie , dass
ls
,ps
undcat
sind auch eingebaute dort Befehle (oder zumindest sein kann, es für embeded Systeme verwendet wird und alles nicht ausgelassen werden benötigt kann).quelle
/bin/echo
die nicht existiert. Sie zeigen nur, dass das eingebauteecho
Programm Vorrang vor allen Programmen im PATH hat.Hier ist der wahre Grund, warum
echo
eine Shell eingebaut werden sollte:Angenommen, Sie haben ein Passwort in
$PASSWORD
. Wie schreibt man es in eine Datei./password
? Natürlich würden die meisten Programmierer schreiben:Wenn
echo
es sich jedoch nicht um eine integrierte Shell handelt, wird das Kennwort durchps
Informationen an alle Benutzer weitergegeben .Natürlich können Sie, wenn Sie clever sein möchten, ein Kennwort speichern, ohne
echo
eine andere Shell-Funktion ausnutzen zu müssen:Als
echo
eingebautes Kennwort ist jedoch ein wichtiger Sicherheitsgurt, da der naheliegendste Weg, ein Kennwort in einer Datei zu speichern, ebenfalls funktionieren sollte.quelle