Verwenden Sie type commandname
. Dies gibt true zurück, wenn commandname
etwas ausführbar ist: Alias, Funktion, eingebauter oder externer Befehl (nachgeschlagen in $PATH
). Alternativ können Sie auch command commandname
den Wert true verwenden, wenn commandname
es 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/sh
OSF1 ≤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 type
immer 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 $PATH
manuell 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 -p
nur ausführbare Dateien in suchen $PATH
. Beachten Sie, dass in bash der Rückgabestatus type -p foo
0 ist, wenn foo
es 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 -p
ist nicht in POSIX; Zum Beispiel hat Debians Asche (die /bin/sh
auf Ubuntu ist) es nicht.