Linux / Befehl type: Identifizieren, wie ein Befehl ausgeführt wird

type ist ein eingebautes Kommando in Bash, das zeigt, ob der von Ihnen eingegebene Befehlsname als Alias, reserviertes Wort, Funktion, eingebautes Kommando oder ausführbare Datei interpretiert wird. Es ist nützlich, um die Ursache zu finden, wenn derselbe Name in mehreren Formen existiert oder ein unerwartetes Programm ausgeführt wird.

Während which sich hauptsächlich darauf konzentriert, ausführbare Dateien in dem PATH zu finden, erklärt type die tatsächliche Befehlsauflösung, einschließlich Aliasen und Funktionen in der aktuellen Shell. Es ist ein guter Befehl, den man zuerst verwenden sollte, wenn man die Bash-Umgebung diagnostiziert.

Was ist der Befehl type?

Bevor ein Befehlsname ausgeführt wird, sucht die Shell nach Aliassen, Funktionen, eingebauten Befehlen und ausführbaren Dateien in der PATH nach bestimmten Regeln. type teilt Ihnen mit, was Bash derzeit unter diesem Namen versteht und was ausgeführt wird.

type selbst ist ein eingebauter Bash-Befehl. Andere Shells haben ähnliche Befehle, aber Optionen und Ausgabeformate können abweichen, daher basieren die Beispiele in diesem Artikel auf Bash.

Grundlegende Syntax und Ergebnistypen

type [-afptP] [name...]

Sie können einen oder mehrere Befehlsnamen angeben.

type ls
type cd
type if
type printf

Die Standardausgabe ist ein für Menschen lesbarer Satz. Je nach Ihren Umgebungseinstellungen können die folgenden Typen erscheinen.

Typ Bedeutung
alias Ein Shell-Alias, der beim Einlesen der Befehlszeile durch eine andere Zeichenfolge ersetzt wird.
keyword Shell-Reservierte Wörter wie if und for.
function Funktionen, die in der aktuellen Shell definiert sind.
builtin In Bash selbst enthaltene eingebaute Befehle.
file Externe ausführbare Dateien, die über die PATH-Suche gefunden werden.

Überprüfen Sie alle Kandidaten mit demselben Namen

-a gibt alle Orte aus, die dem Namen entsprechen, einschließlich Aliase, Funktionen, eingebaute Befehle und in PATH gefundene ausführbare Dateien.

type -a printf
type -a test
type -a ls

printf kann sowohl als eingebauter Bash-Befehl als auch als externe ausführbare Datei existieren. Das grundlegende type printf zeigt nur die erste Option an, die gewählt würde, aber -a ist nützlich, um Kandidaten zu untersuchen, die verborgen sind.

Optionen zur Auswahl des Ausgabeformats

Nur Typ drucken mit -t

-t gibt eines von alias, keyword, function, builtin oder file aus, anstelle eines beschreibenden Satzes. Wenn der Name nicht gefunden wird, wird nichts ausgegeben und ein Fehlerstatus zurückgegeben.

type -t cd
type -t if
type -t ls

Ausführbaren Pfad mit -p und -P drucken

-p druckt den ausführbaren Pfad, wenn der Name als externe Datei interpretiert wird. Es wird möglicherweise nichts ausgegeben, wenn zuerst ein Alias, eine Funktion oder ein eingebauter Befehl gewählt wird.

type -p ls
type -p cd

-P erzwingt eine PATH-Suche, um einen ausführbaren Kandidaten zu finden, selbst wenn der aktuelle Name ein Alias oder eingebauter Befehl ist.

type -P printf
type -P test

Wenn Bash einen gespeicherten Hash-Pfad hat, können -p und -P einen gespeicherten Pfad anzeigen, der vom ersten Eintrag im aktuellen PATH abweicht. Im Zweifelsfall löschen Sie den Hash mit hash -r und überprüfen Sie erneut.

Zusammenfassung der Typoptionen

Option Beschreibung
-a Gibt alle Kandidaten aus, die dem Namen entsprechen.
-f Überspringt die Suche nach Funktionen. Wenn nicht zusammen mit -a verwendet, kann die Wirkung eingeschränkt sein.
-p Gibt den Pfad aus, wenn das Standardinterpretationsergebnis ein externes ausführbares Programm ist.
-P Findet das ausführbare Programm in PATH mit Vorrang vor anderen Typen.
-t Gibt den Befehls-Typ als ein einziges Wort aus.

Wenn sich der Befehl aufgrund von Aliasen und Funktionen unterscheidet

Alias überprüfen

In einer interaktiven Shell können häufig verwendete Optionen in Aliasen enthalten sein.

type ls
alias ls

Um den ursprünglichen Namen ohne Anwendung eines Alias auszuführen, können Sie je nach Situation einen Backslash oder einen absoluten Pfad verwenden.

\ls
/usr/bin/ls

Funktionsdefinitionen überprüfen

Wenn eine Shell-Funktion mit demselben Namen wie ein externer Befehl definiert ist, kann die Funktion zuerst ausgeführt werden. Die Standardausgabe von type kann die Funktionsdefinition anzeigen.

type deploy
type -t deploy

Wenn Sie einen externen Befehl mit demselben Namen innerhalb einer Funktion aufrufen müssen, können Sie command name verwenden, um die Funktionssuche zu umgehen.

type, command -v und which vergleichen

Methode Funktionen
type name Es erklärt Aliase, reservierte Wörter, Funktionen, eingebaute Befehle und Dateien in Bash im Detail.
type -a name Überprüft alle möglichen Kandidaten mit demselben Namen.
command -v name Relativ portabel zur Überprüfung der Befehlsexistenz und -auflösung in Shell-Skripten.
which name Je nach Implementierung findet es hauptsächlich ausführbare Dateien in PATH und kann Shell-Funktionen oder Aliase möglicherweise nicht genau widerspiegeln.

Für interaktive Diagnosen in Bash ist type im Allgemeinen geeignet, und für die Überprüfung der Befehlsexistenz in POSIX-Shell-Skripten ist command -v normalerweise geeignet.

Sicheres Verwenden in Shell-Skripten

Verzweigung je nach Art des Befehls

kind=$(type -t "$1") || {
 printf 'Command not found: %s\n' "$1" >&2
 exit 1
}

case $kind in
 alias|function|builtin|file|keyword)
 printf '%s: %s\n' "$1" "$kind";;
esac

Dieses Beispiel basiert auf der type -t-Ausgabe von Bash, stellen Sie also sicher, dass der Interpreter des Skripts Bash ist.

Verwenden Sie den Exit-Status anstelle von Ausgabemeldungen

Die Standardausgabe kann je nach Version oder Gebietsschema variieren. Um nur die Existenz eines Befehls zu prüfen, parsen Sie nicht die Ergebniszeichenfolge; prüfen Sie den Exit-Status.

if type git >/dev/null 2>&1; then
 printf '%s\n' 'git is available.'
fi

Häufig gestellte Fragen

type -p gibt nichts aus

Der Name kann zunächst als Alias, Funktion oder interner Befehl interpretiert werden, oder es gibt möglicherweise keine externe ausführbare Datei. Verwenden Sie type -a name, um alle Kandidaten zu sehen, und type -P name, um ausschließlich die externe Datei zu finden.

Nach Änderung von PATH erscheint der vorherige Pfad

Frühere Ausführungspfade können in Bashs Hash-Tabelle verbleiben. Überprüfen Sie den aktuellen Hash und löschen Sie ihn gegebenenfalls, bevor Sie erneut suchen.

hash
hash -r
type -P command

Aliase sind in Skripten nicht sichtbar.

In nicht-interaktivem Bash ist die Alias-Erweiterung standardmäßig nicht aktiviert. Die Interpretation von Befehlen kann zwischen interaktiven Shells und Skripten unterschiedlich sein, daher wird empfohlen, sich in der Automatisierung nicht auf Aliase zu verlassen.

type findet nur den Speicherort von ausführbaren Dateien?

Nein. Es zeigt, wie Bash den Namen aktuell interpretiert und unterscheidet Aliase, reservierte Wörter, Funktionen und eingebaute Befehle.

Ist die Ausgabereihenfolge von type -a die Ausführungspriorität?

Der erste Punkt hilft im Allgemeinen zu verstehen, welches Ziel die aktuelle Shell ausgewählt hat. Allerdings können der Hash, die Shell-Optionen und der Ausführungskontext einen Einfluss haben, daher sollten bei wichtigen Aufgaben die tatsächliche Umgebung gemeinsam überprüft werden.

Stimmen die Optionen in anderen Shells überein?

Das muss nicht so sein. Die Optionen in diesem Text basieren auf Bash. Für Zsh, Dash usw. prüfen Sie bitte die Hilfe für diese Shell.

Zusammenfassung

type ist ein Werkzeug, das zwischen Aliassen, Funktionen, eingebauten Befehlen und ausführbaren Dateien mit demselben Namen unterscheidet und die tatsächliche Befehlsauflösung diagnostiziert. Mit der Standardausgabe können Sie Erklärungen lesen, -a verwenden, um alle Kandidaten zu finden, -t, um nur den Typ zu erhalten, und -P, um gezielt nach externen ausführbaren Dateien zu suchen.

Wenn ein Befehl sich anders verhält als erwartet, versuchen Sie zunächst, type -a name auszuführen. Weitere grundlegende Befehle finden Sie in der Liste und Übersicht der Linux-Befehle.

Verweisen Sie auf offizielle Dokumente