Wenn ich den type
Befehl verwende, um herauszufinden, ob cat
eine Shell oder ein externes Programm eingebaut ist, erhalte ich die folgende Ausgabe:
-$ type cat
cat is hashed (/bin/cat)
-$
Bedeutet das, dass cat
es sich um ein externes Programm handelt /bin/cat
?
Ich war verwirrt, denn als ich die Ausgabe unten überprüfte, stellte echo
ich fest, dass es sich um ein built-in
aber auch ein Programm handelt/bin/echo
-$ type echo
echo is a shell builtin
-$ which echo
/bin/echo
-$
Also konnte ich die Logik nicht nutzen, die /bin/cat
zwangsläufig ein externes Programm bedeutet, da Echo /bin/echo
doch noch eingebaut war.
Woher weiß ich, was cat
ist? Eingebaut oder extern?
bash
cat
echo
shell-builtin
sps
quelle
quelle
type which
Ich könnte dir die Antwort geben, warumwhich
ich dir die Antwort nicht geben werde.cat
undls
sind / wurden von Stallman selbst geschrieben. Sie wären überrascht, wie viel er geschrieben hat. Vergessen Sie nicht, dass er die ersten Versionen des Compilers geschrieben hat, der heute der beste Compiler der Welt ist, der ALLES und die meisten Kern-Utils kompiliert. Sagen Sie es einfachAntworten:
type
sagt Ihnen, was die Shell verwenden würde. Beispielsweise:Das heißt, wenn Sie an der Bash-Eingabeaufforderung Folgendes eingeben, erhalten Sie
echo
die integrierte Funktion. Wenn Sie den Pfad wie in angeben/bin/echo
, erhalten Sie den externen Befehl.which
Im Gegensatz dazu ist es ein externes Programm, das keine besonderen Kenntnisse darüber hat, was die Shell tun wird. Auf debian-ähnlichen Systemen gibtwhich
es ein Shell-Skript, das den Pfad nach der ausführbaren Datei durchsucht. Auf diese Weise erhalten Sie den Namen der externen ausführbaren Datei, selbst wenn die Shell eine integrierte Datei verwenden würde.Wenn ein Befehl nur als integrierter Befehl verfügbar ist,
which
wird nichts zurückgegeben:Nun schauen wir uns an
cat
:cat
ist eine externe ausführbare Datei, keine eingebaute Shell.quelle
type -all echo
(in der Reihenfolge) herausfinden, welches "Echo" der Shell bekannt ist (das erste ist das, das die Shell aufruft, wenn Sie nichts angeben, um die Reihenfolge zu ändern, z. B. Aufrufen von"echo"
oder\echo
, odercommand echo
).echo
aus historischen Gründen. Es begann als externer Befehl und wurde dann als integrierter Befehl hinzugefügt. Frühere Versionen der Bourne-Shell (/bin/sh
) hatten es nicht./bin/echo
wurde aus Kompatibilitätsgründen beibehalten, da alles Mögliche davon abhing. (Dasselbe passierte mittest
.)which
selbst kann eine Shell eingebauten cmd sein, zum Beispiel in tcsh:which which
which: shell built-in command.
cat is hashed (/bin/cat)
ist wiecat is /bin/cat
(das heißt, es ist ein externes Programm ).Der Unterschied besteht darin, dass Sie bereits
cat
in dieser Sitzung ausgeführt haben. Bash hat sie also bereits nachgeschlagen$PATH
und die resultierende Position in einer Hash-Tabelle gespeichert, sodass sie in dieser Sitzung nicht erneut nachgeschlagen werden muss .Führen Sie den folgenden Befehl aus, um alle Befehle anzuzeigen, die in Ihrer Sitzung gehasht wurden
hash
quelle
Eine andere Möglichkeit, die Liste der eingebauten Shell zu überprüfen: Verwenden Sie
compgen
die Shell selbst!Der folgende Befehl listet alle in die Shell eingebauten Befehle auf:
Sie können überprüfen
cat
,echo
indem Sie wie folgt greifen: -Sie können
compgen -b | grep cat
Rückgaben ohne Ausgabe sehen,cat
dh es ist keine Shell eingebaut .Besuchen Sie eine Liste nützlicher Optionen von
compgen
.Sie können auch einen anderen eingebauten Befehl verwenden:
help
um die eingebaute Shell anzuzeigen.quelle
compgen
?man bash | grep -e '-A action$' -A 32
Sie wahrscheinlich eine Ausgabe wie bekommen diese . (Stelle nachher erhöhen / verringern-A
, um richtig zu verwalten).Sie können auch den Befehl verwenden
whereis
, der effizienter ist, da er zeigt, wo sich der Befehl auf dem Computer befindet, wie auch die Handbuchseitenbibliothek usw.quelle
Andere haben schon darüber geantwortet
cat
, ich möchte nur das Problem mit erklärenecho
. Wenn Sie Art der Verwendung-a
Option (Liste alle Spiele), werden Sie sehen, dassecho
ist sowohl ein Shell - builtin und ein externes Programm:Die beiden sind völlig unabhängig voneinander.
type
Ohne Optionen wird einfach der erste gefundene passende Befehl zurückgegeben. Gebenfoo
Sie also ein, was ausgeführt wird, wenn Sie ausführenfoo
. Möglicherweise gibt es andere Optionen, die jedoch nur angezeigt werden, wenn Sie sie verwenden-a
.quelle
Da es hier mehrere gute Antworten zum Verwenden von type gibt, um herauszufinden, ob ein Befehl wie
cat
ein eingebautes oder ein externes Programm ist. Ich werde einen allgemeineren Ansatz verfolgen. Es gibt einige Befehle, die erstellt werden müssen, da sie sich auf die aktuelle Shell auswirken. Drei klassische Beispiele sindcd
,exec
undexit
. Es gibt einige Befehle, die nicht eingebaut werden dürfen, da ihre Funktionalität vom Verhalten der ausführbaren oder Systemaufrufe abhängt. Beispiele für solche Programme sindsu
,sudo
,calife
undsuper
. Alle anderen Befehle können als integrierte oder externe Programme erstellt werden.cat
ist ein großartiges Beispielprogramm für diese Klasse, da es Shells gibt, die sie als eingebauten Code enthalten, und Shells, die dies nicht tun. Es ist anzumerken, dass viele Befehle dieser Klasse, die als integrierte Befehle verfügbar sind, auch als externe Programme verfügbar sind.quelle