Zastosowanie type commandname
. Zwraca true, jeśli commandname
jest cokolwiek wykonywalnego: alias, funkcja, wbudowane lub zewnętrzne polecenie (sprawdzone w $PATH
). Alternatywnie, użyj command commandname
zwracanej wartości true, jeśli commandname
jest to polecenie wbudowane lub zewnętrzne (wyszukiwane w $PATH
).
exists () {
type "$1" >/dev/null 2>/dev/null
}
Istnieje kilka wariantów sh (zdecydowanie wcześniejszych niż POSIX; wiem o /bin/sh
OSF1 ≤3.x i niektórych wersjach powłoki Almquist we wczesnych wersjach NetBSD i kilku dystrybucjach Linuksa z XX wieku), w których type
zawsze zwraca 0 lub nie istnieć. Nie sądzę, aby jakikolwiek system był dostarczany z tym tysiącleciem. Jeśli kiedykolwiek je spotkasz, możesz skorzystać z funkcji $PATH
ręcznego wyszukiwania :
exists () { (
IFS=:
for d in $PATH; do
if test -x "$d/$1"; then return 0; fi
done
return 1
) }
Ta funkcja jest ogólnie przydatna, jeśli chcesz wykluczyć wbudowane funkcje i funkcje i wyszukać nazwę w $PATH
. Większość powłok ma do tego wbudowane command -v
, choć jest to stosunkowo nowy dodatek do POSIX (wciąż opcjonalny od POSIX: 2004). Jest to w zasadzie wersja przyjazna dla programistów type
: drukuje pełną ścieżkę do pliku wykonywalnego $PATH
, samą nazwę dla funkcji wbudowanej lub funkcji oraz definicję aliasu dla aliasu.
exists_in_path () {
case $(command -v -- "$1") in
/*) return 0;;
alias\ *) return 1;; # alias
*) return 1;; # built-in or function
esac
}
Ksh, bash i zsh również muszą type -p
wyszukiwać tylko pliki wykonywalne $PATH
. Zauważ, że w bash, zwracanym statusem type -p foo
jest 0, jeśli foo
jest wbudowaną funkcją lub; jeśli chcesz przetestować plik wykonywalny w $PATH
, musisz sprawdzić, czy dane wyjściowe nie są puste. type -p
nie ma w POSIX; na przykład jesion Debiana (który jest /bin/sh
na Ubuntu) go nie ma.