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:
| Stufe | Was geprüft wird |
|---|---|
| 1 | Alias |
| 2 | Keyword (if, while, …) |
| 3 | Funktion |
| 4 | Builtin (cd, echo, …) |
| 5 | Hash-Cache, dann PATH |
type ls
type cd
type ifls is aliased to `ls --color=auto'
cd is a shell builtin
if is a shell keywordOptionen
-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.
type -a lsls is aliased to `ls --color=auto'
ls is /usr/bin/ls
ls is /bin/lsEmpfehlung: 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:
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" ;;
esacBesonderheiten
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
- Bash Reference Manual: Bash Builtins —
typein der offiziellen Bash-Doku - POSIX type(1p) — POSIX-Spezifikation
- Why not use which? — Warum
typeundcommand -vbesser sind
Verwandte Artikel
- Linux which — Der pragmatische PATH-Sucher
- Linux command — Der POSIX-Standard für Skripte
- Linux whereis — Binary, Source und Manpage
- Linux hash — Pfad-Cache der Bash
- Linux Shell — Auflösungsreihenfolge im Detail