type ist der Bash-Builtin, der ehrlich antwortet, was beim Aufruf eines Befehls wirklich passiert. Im Gegensatz zu which kennt type die vollständige Auflösungskette — Aliases, Keywords, Funktionen, Builtins und PATH-Treffer. Wer in Bash arbeitet, sollte type als erste Wahl gegenüber which etablieren.

Was type macht

type ist in Bash, Zsh und Ksh als Shell-Builtin eingebaut und durchläuft dieselbe Auflösungsreihenfolge wie die Shell selbst:

StufeWas geprüft wird
1Alias
2Keyword (if, while, …)
3Funktion
4Builtin (cd, echo, …)
5Hash-Cache, dann PATH
Bash type für verschiedene Befehle
type ls
type cd
type if
Output
ls is aliased to `ls --color=auto'
cd is a shell builtin
if is a shell keyword

Optionen

Optionen
-t

Gibt nur die Kategorie zurück: alias, keyword, function, builtin oder file. Ideal in Skripten, die je nach Typ verzweigen.

-p

Gibt nur den Pfad zur Datei aus — und zwar nur, wenn der Befehl tatsaechlich eine Datei ist. Bei Aliases, Funktionen oder Builtins bleibt die Ausgabe leer.

-a

Zeigt alle möglichen Auflösungen: den Alias UND die zugrunde liegende Datei UND alle weiteren PATH-Treffer.

-P

Erzwingt einen reinen PATH-Lookup und ignoriert Aliases, Funktionen und Builtins. Liefert immer einen Pfad, falls einer existiert.

-f

Unterdrückt die Suche nach Shell-Funktionen.

Bash type -a zeigt alles
type -a ls
Output
ls is aliased to `ls --color=auto'
ls is /usr/bin/ls
ls is /bin/ls

Empfehlung: type statt which

type macht sichtbar, was which verschweigt: Aliases, Funktionen, Builtins. Für portable Skripte greifst du zu command -v — das gehört zum POSIX-Standard.

Skript-Verwendung mit -t

Mit -t bekommst du eine maschinenlesbare Kategorie zurück — perfekt für Verzweigungen:

Bash Verzweigen nach Typ
case "$(type -t deploy)" in
    function) echo "deploy ist eine Shell-Funktion" ;;
    file)     echo "deploy ist ein externes Programm" ;;
    alias)    echo "deploy ist ein Alias" ;;
    *)        echo "deploy gibt es nicht" ;;
esac

Besonderheiten

type ist ein Builtin und nicht als Skript aufrufbar

type lebt im Speicher der Shell — es gibt keine /usr/bin/type-Datei (auf manchen Systemen existiert ein POSIX-Wrapper, aber er kann keine Aliases der aufrufenden Shell sehen). In #!/bin/sh-Skripten, die nicht in Bash laufen, ist type daher unzuverlässig. Dort gehört command -v hin.

-P erzwingt den PATH-Lookup, -p nicht

type -p ls gibt nichts zurück, wenn ls ein Alias ist — kleines -p respektiert die Auflösungskette und liefert nur dann einen Pfad, wenn der Befehl eine Datei ist. Großes -P ignoriert Aliases, Funktionen und Builtins komplett und sucht ausschließlich im PATH. Wer die echte Binary will, nimmt -P.

type sieht den Hash-Cache

Wenn die Shell einen Pfad bereits aufgelöst und im Hash-Cache abgelegt hat, berücksichtigt type diesen Cache. Nach einem Programm-Update an einem neuen Pfad kann type deshalb den alten Pfad anzeigen — bis du hash -r aufrufst. Mehr dazu im Artikel zu hash.

Funktionen werden als Quelltext angezeigt

Hast du eine Funktion deploy() { ... } definiert, gibt type deploy den kompletten Funktions-Body zurück — praktisch zum Nachlesen, was eigentlich passiert. Das funktioniert nur für Funktionen, die in der laufenden Shell definiert sind.

Weiterführende Ressourcen

Externe Quellen

/ Weiter

Zurück zu Dateisystem

Zur Übersicht