Ich habe festgestellt, dass /bin/echo
auf meinem Ubuntu MATE 17.04-System eine ausführbare Binärdatei vorhanden ist .
Ich dachte, das ist seltsam, weil
$ type echo
echo is a shell builtin
/bin/echo
Kurztests legen nahe, dass dies dasselbe wie das in Bash eingebaute Verfahren bewirkt echo
:
$ /bin/echo foo
foo
$ /bin/echo $USER
zanna
Also, warum gibt es eine andere Version des echo
Bash-Programms, und warum oder wann würde ich es verwenden wollen?
command-line
bash
echo
Zanna
quelle
quelle
echo
sie als eingebaute Shell bereitgestellt wird, während bei dieser Frage gefragt wird, warum sie als externer Befehl bereitgestellt wird.Antworten:
Wenn Sie eine
bash
Eingabeaufforderung öffnen und einenecho
Befehl eingeben , wird eine eingebaute Shell verwendet, anstatt sie auszuführen/bin/echo
. Die Gründe, warum es immer noch wichtig ist/bin/echo
zu existieren, sind:echo
eingebauten. Dies ist eigentlich nicht erforderlich.Nehmen wir an, Sie möchten alle regulären Dateien, deren Namen mit
abc
irgendwo in beginnensrc
, verschieben, um die Nummer 1 zu erweiterndest
. Es gibt mehrere Möglichkeiten, dies zu tun, aber eine davon ist:Angenommen, Sie möchten nicht nur diesen Befehl ausführen, sondern jeden Befehl anzeigen, der zuerst ausgeführt wird. Nun, dann können Sie
echo
dem Befehl genau wie in anderen Kontexten voranstellen :Benutzt
find
aber keine Shell. Das läuft/bin/echo
.Außer
find
mit-exec
oder-execdir
wird die/bin/echo
ausführbare Datei von anderen Programmen aufgerufen, die selbst Programme ausführen, jedoch nicht über eine Shell. Dies geschieht mit demxargs
Befehl (der bezieht sich auffind
), sowie in einer Reihe von anderen Zusammenhängen, wie beispielsweise dieExec=
Leitung von einer.desktop
Datei . Ein anderes Beispiel ist, wenn Sie ausführensudo echo
, was nützlich sein kann, um zu testen, obsudo
es funktioniert.Ebenso haben einige Muscheln einen
printf
eingebauten,/usr/bin/printf
existieren aber auch.Ein weniger häufiger möglicher Grund, den Sie absichtlich verwenden könnten,
/bin/echo
ist, wenn Sie sich auf die Unterschiede zwischen demecho
Befehl und dem Befehl verlassen, der von Ihrer Shell bereitgestellt wird.man echo
Dokumente/bin/echo
;help echo
inbash
dokumenten dasbash
eingebaute.echo
ist nicht sehr portabel, da unterschiedliche Implementierungen - sowohl auf Betriebssystemen als auch auf Shells auf demselben Betriebssystem - unterschiedliche Optionen (z. B.-e
) unterstützen und sich in der Behandlung von Backslashes unterscheiden . Natürlich ist es besser, sich nicht auf solche Details zu verlassen,printf
sondern diese zu verwenden, da sie weitaus portabler sind .In
bash
können Sie dietype
eingebaute Show ebenfalls erstellen/bin/echo
- vorausgesetzt, sie/bin
ist in Ihrer,$PATH
wie es immer sein sollte - indem Sie ihr die-a
Flagge übergeben :quelle
cd
, dass eine ausführbare Datei vorhanden ist (die beim Ausführen das Verzeichnis ändert und beendet und den Aufrufer an der Stelle belässt, an der er sich zuvor befunden hat), und einige Betriebssysteme verfügen über eine solche Datei . Es kann hilfreich sein, 4.1 in den GNU-Standards zu zitieren .cd
ist einfach ein Test der Fähigkeit, auf ein bestimmtes Verzeichnis zuzugreifen: Wenn dies/usr/bin/cd some/dir
erfolgreich ist, haben Sie in einer Aufnahme Folgendes getestet: a) dassome/dir
existiert, b) dass es sich um ein Verzeichnis oder einen Link zu einem Verzeichnis handelt, und c) das Erforderliche Berechtigungen für den Zugriff auf dieses Verzeichnis sind vorhanden. alles ohne deinen eigenen Zustand zu ändern./bin/echo
auch nicht der\bin\echo
Fall, es sei denn, Sie verwenden Windows. ;)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
):Wie viele davon müssen eingebaut werden?
[
,echo
,false
,printf
,pwd
,test
, Undtrue
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). Bashsprintf
nutzt zumindest den Vorteil, dass es ein integriertes Element ist:printf -v var
Speichert die Ausgabe in der Variablenvar
.time
in bash ist auch etwas Besonderes: Indem Sie ein Schlüsselwort sind, können Sie beliebige Befehlslisten in bash zeitlich festlegen (Bindestrich hat keintime
Ä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):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. Die
sh
von 2.9 BSD , und Sie werden keine findenecho
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 erhaltenzmv
, 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?quelle
:
da ein Externer nicht wirklich ein NOP wäre, hätten Sie immer noch einePATH
Suche, einen Versuch, den Befehl auszuführen usw., wenn alles, was Sie wirklich wollen, darin besteht, ausdrücklich nichts zu tun.:
als eingebauter macht das.pwd
eingebaut sein, damit es so funktioniert, mit dem Standardverhalten, dass der "logische" Pfad (pwd -L
) angezeigt wird ./bin/pwd
konnte nur daspwd -P
Verhalten des Anzeigens der tatsächlichen übergeordneten Verzeichnisse implementieren , nicht des Symlinks, den Siecd
durchlaufen haben.pwd
'Status wird durch das Vorhandensein von etwas beeinträchtigtPWD
, aber ja, das ist auch eine Instanz von Bash, die den eingebauten Status verwendet, um die Funktionalität zu verbessern