Wenn Sie wissen wollen welches Programm ein bestimmtes Kommando aufruft, dann hilft Ihnen der Shell Befehl which. Alle übergebenen Argumente interpretiert which als Namen von ausführbaren Dateien und sucht den eingestellten Suchpfad der Shell danach ab. Der Pfad ist in der Umgebungsvariablen PATH gespeichert und hat die Form einer Liste von Verzeichnissen, die durch Doppelpunkte voneinander getrennt sind.
Sie können sich einen einfachen Shell Befehl which, für die Bash Shell, mit dem find-Kommando selber schreiben:
$ alias mywhich='find 2>/dev/null ${PATH//:/ } -name'
Der Aufruf von "mywhich which" liefert jetzt das gleiche Ergebnis wie das Kommando "which -a which". Warum -a? Der Shell Befehl which zeigt normalerweise nur den ersten Treffer für jedes angegebenen Programm an. Mit dem Schalter -a listet which alle Treffer auf.
Auf aktuellen Debian-Systemen liegt das eigentliche Programm which unter dem Pfad /bin/which und es existiert, aus Gründen der Kompatibilität, ein symbolischer Link auf dieses Programm unter /usr/bin/which. Der Aufruf "which -a which" zeigt daher zwei Pfade an.
Ein weiterer Unterschied zwischen dem Programm which und dem Alias mywhich ist, dass mywhich nur dann richtig funktioniert, wenn nur ein einziges Argument angegeben wird. Der Shell Befehl which versucht dagegen, alle angegebenen Namen zu finden.
Für den Einsatz in Shell-Skripten ist darüber hinaus noch interessant, dass der Shell Befehl which an seinem Exit-Status erkennen lässt, ob er alle angegebenen Programme gefunden hat, oder nicht. War er zu 100% erfolgreich, dann ist der Exit-Status 0, was unter Unix, wie in der Programmiersprache C, "wahr" (englisch true) bedeutet. Hat which mindestens ein Programm nicht gefunden, dann ist der Status 1, und wurden ungültige Schalter angegeben, dann gibt der Shell Befehl which 2 zurück. Da alles, was in einem numerischen Vergleich nicht 0 ist, als "falsch" interpretiert wird, können Sie in einem Shell-Skript, wie in dem folgenden Beispiel, einfach herausfinden, ob alle benötigten Befehle vorhanden sind, indem Sie den Exit-Status des Befehls which überprüfen.
#! /bin/sh
which who which when where
test $? -eq 0 || { echo "Notwendige Programme fehlen" 2>&1; exit 2; }
Beachten sollten Sie dabei aber, dass der Shell Befehl which nur nach Programmen sucht und nicht nach Aliasen oder Befehlen, die in die Shell eingebaut sind. Hier hilft der eingebaute Shell Befehl type weiter, der auch anzeigt, um welche Art von Befehl es sich handelt. Der Aufruf von type mit dem Schalter -p liefert das gleiche Ergebnis wie der einfache Shell Befehl which ohne Schalter.