Verwenden Sie type commandname. Dies gibt true zurück, wenn commandnameetwas ausführbar ist: Alias, Funktion, eingebauter oder externer Befehl (nachgeschlagen in $PATH). Alternativ können Sie auch command commandnameden Wert true verwenden, wenn commandnamees sich um einen eingebauten oder einen externen Befehl handelt (der nachgeschlagen wurde $PATH).
exists () {
type "$1" >/dev/null 2>/dev/null
}
Es gibt einige sh-Varianten (definitiv vor POSIX; ich kenne /bin/shOSF1 ≤3.x und einige Versionen der Almquist-Shell, die in früheren NetBSD-Versionen und einigen Linux-Distributionen des 20. Jahrhunderts enthalten waren), bei denen typeimmer 0 zurückgegeben wird oder nicht existieren. Ich glaube nicht, dass in diesem Jahrtausend Systeme mit diesen ausgeliefert wurden. Wenn Sie jemals auf sie stoßen, können Sie mit der folgenden Funktion $PATHmanuell suchen :
exists () { (
IFS=:
for d in $PATH; do
if test -x "$d/$1"; then return 0; fi
done
return 1
) }
Diese Funktion ist im Allgemeinen nützlich, wenn Sie integrierte Funktionen ausschließen und den Namen in nachschlagen möchten $PATH. Die meisten Shells verfügen über eine integrierte Funktion command -v, obwohl es sich um eine relativ neue POSIX-Erweiterung handelt (ab POSIX: 2004 immer noch optional). Dies ist im Grunde eine programmiererfreundliche Version von type: Sie gibt den vollständigen Pfad für eine ausführbare Datei $PATH, den bloßen Namen für eine integrierte Funktion und eine Aliasdefinition für einen Alias aus.
exists_in_path () {
case $(command -v -- "$1") in
/*) return 0;;
alias\ *) return 1;; # alias
*) return 1;; # built-in or function
esac
}
Ksh, bash und zsh müssen auch type -pnur ausführbare Dateien in suchen $PATH. Beachten Sie, dass in bash der Rückgabestatus type -p foo0 ist, wenn fooes sich um eine integrierte Funktion handelt. Wenn Sie auf eine ausführbare Datei in testen möchten $PATH, müssen Sie sicherstellen, dass die Ausgabe nicht leer ist. type -pist nicht in POSIX; Zum Beispiel hat Debians Asche (die /bin/shauf Ubuntu ist) es nicht.