Ist 'cat' eine eingebaute Shell oder ein externes Programm?

33

Wenn ich den typeBefehl verwende, um herauszufinden, ob cateine Shell oder ein externes Programm eingebaut ist, erhalte ich die folgende Ausgabe:

-$ type cat
cat is hashed (/bin/cat)
-$

Bedeutet das, dass cates sich um ein externes Programm handelt /bin/cat?

Ich war verwirrt, denn als ich die Ausgabe unten überprüfte, stellte echoich fest, dass es sich um ein built-inaber 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/catzwangsläufig ein externes Programm bedeutet, da Echo /bin/echodoch noch eingebaut war.

Woher weiß ich, was catist? Eingebaut oder extern?

sps
quelle
1
-Der Befehl cat ist ein externes Programm, das Teil des Systems ist, da die vielen Aktionen, die es ausführen kann, nicht einfach integriert sind.
Joke Sr. OK
12
type whichIch könnte dir die Antwort geben, warum whichich dir die Antwort nicht geben werde.
Dubu
1
Hängt von der verwendeten Shell ab
nsn
6
Witzige Tatsache: Beide catund lssind / 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 einfach
Alec Teal
2
@AlecTeal Wissen Sie, dass die meisten Unix-Systeme Versionen von ls und cat verwenden, die lange älter sind als die GNU-Versionen, in denen Richard Stallman mitgewirkt hat?
Ross Ridge

Antworten:

59

typesagt Ihnen, was die Shell verwenden würde. Beispielsweise:

$ type echo
echo is a shell builtin
$ type /bin/echo
/bin/echo is /bin/echo

Das heißt, wenn Sie an der Bash-Eingabeaufforderung Folgendes eingeben, erhalten Sie echodie integrierte Funktion. Wenn Sie den Pfad wie in angeben /bin/echo, erhalten Sie den externen Befehl.

whichIm Gegensatz dazu ist es ein externes Programm, das keine besonderen Kenntnisse darüber hat, was die Shell tun wird. Auf debian-ähnlichen Systemen gibt whiches 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, whichwird nichts zurückgegeben:

$ type help
help is a shell builtin
$ which help
$ 

Nun schauen wir uns an cat:

$ type cat
cat is hashed (/bin/cat)
$ which cat
/bin/cat

cat ist eine externe ausführbare Datei, keine eingebaute Shell.

John1024
quelle
5
Sie können 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, oder command echo).
Olivier Dulac,
Gute Antwort. Ein Zusatz: Es gibt zwei Versionen von echoaus 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/echowurde aus Kompatibilitätsgründen beibehalten, da alles Mögliche davon abhing. (Dasselbe passierte mit test.)
alexis
Randnotiz: whichselbst kann eine Shell eingebauten cmd sein, zum Beispiel in tcsh:which which which: shell built-in command.
Dan Cornilescu
Ich komme zu spät zur Party, aber warum checkst du nicht die Manpage und siehst tatsächlich die Zahl in Klammern, die angibt, ob es sich um eine eingebaute Shell handelt oder was auch immer
poz2k4444
46

cat is hashed (/bin/cat)ist wie cat is /bin/cat(das heißt, es ist ein externes Programm ).

Der Unterschied besteht darin, dass Sie bereits catin dieser Sitzung ausgeführt haben. Bash hat sie also bereits nachgeschlagen $PATHund 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

$ hash
hits    command
   2    /usr/bin/sleep
   3    /usr/bin/man

$ type sleep
sleep is hashed (/usr/bin/sleep)

$ type man
man is hashed (/usr/bin/man)

$ type ls
ls is /usr/bin/ls

$ type cat
cat is /usr/bin/cat

$ type echo
echo is a shell builtin
André Chalella
quelle
9
Meiner Meinung nach ist dies die einzige Antwort, die Ihre Frage beantwortet :)
André Chalella
IMHO ist das ^^^ wahr. Diese Antwort sollte die akzeptierte sein.
LinuxSecurityFreak
4

Eine andere Möglichkeit, die Liste der eingebauten Shell zu überprüfen: Verwenden Sie compgendie Shell selbst!

Der folgende Befehl listet alle in die Shell eingebauten Befehle auf:

compgen -b

Sie können überprüfen cat, echoindem Sie wie folgt greifen: -

$ compgen -b | grep echo
echo
$ compgen -b | grep cat
$ 

Sie können compgen -b | grep catRückgaben ohne Ausgabe sehen, catdh es ist keine Shell eingebaut .

Besuchen Sie eine Liste nützlicher Optionen von compgen.


Sie können auch einen anderen eingebauten Befehl verwenden: helpum die eingebaute Shell anzuzeigen.

$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.
Pandya
quelle
Ich kann für diese Optionen keine offizielle Dokumentation finden. Wissen Sie, wo diese vorhanden ist?
Random832
@ Random832 redest du über Optionen für compgen?
Pandya
Ja, ich konnte in der Bash-Manpage nichts darüber finden, was -b oder die Hälfte der anderen Optionen bedeuten. Gefunden später unter gnu.org/software/bash/manual/html_node/…
Random832
@ Random832 versuchen man bash | grep -e '-A action$' -A 32Sie wahrscheinlich eine Ausgabe wie bekommen diese . (Stelle nachher erhöhen / verringern -A, um richtig zu verwalten).
Pandya
4

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.

Witz Sr. OK
quelle
- Entschuldigen Sie mich für mein schlechtes Englisch, denn ich lerne gerade noch und benutze es nicht so gut! ...
Joke Sr. OK
2

Andere haben schon darüber geantwortet cat, ich möchte nur das Problem mit erklären echo. Wenn Sie Art der Verwendung -aOption (Liste alle Spiele), werden Sie sehen, dass echoist sowohl ein Shell - builtin und ein externes Programm:

$ type -a echo
echo is a shell builtin
echo is /bin/echo

Die beiden sind völlig unabhängig voneinander. typeOhne Optionen wird einfach der erste gefundene passende Befehl zurückgegeben. Geben fooSie also ein, was ausgeführt wird, wenn Sie ausführen foo. Möglicherweise gibt es andere Optionen, die jedoch nur angezeigt werden, wenn Sie sie verwenden -a.

terdon
quelle
2

Da es hier mehrere gute Antworten zum Verwenden von type gibt, um herauszufinden, ob ein Befehl wie catein 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 sind cd, execund exit. 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 sind su, sudo, califeund super. Alle anderen Befehle können als integrierte oder externe Programme erstellt werden.catist 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.

hildred
quelle