Використовуйте type commandname
. Це повертає істину, якщо що- commandname
небудь виконується: псевдонім, функція, вбудована чи зовнішня команда (шукано в $PATH
). Крім того, використовуйте, command commandname
що повертає true, якщо commandname
це вбудована чи зовнішня команда (шукана в $PATH
).
exists () {
type "$1" >/dev/null 2>/dev/null
}
Є кілька варіантів sh (безумовно, до POSIX; я знаю /bin/sh
під OSF1 ≤3.x та деякі версії оболонки Almquist, знайдені в ранніх версіях NetBSD та декількох дистрибутивах Linux 20 століття), де type
завжди повертається 0 чи ні існують. Я не думаю, що жодна система поставляється з цим тисячоліттям. Якщо ви коли-небудь стикаєтеся з ними, ось функція, яку ви можете використовувати для пошуку $PATH
вручну:
exists () { (
IFS=:
for d in $PATH; do
if test -x "$d/$1"; then return 0; fi
done
return 1
) }
Ця функція, як правило, корисна, якщо ви хочете виключити вбудовані та функції та шукати ім'я в $PATH
. Більшість оболонок мають вбудований для цього, command -v
хоча це відносно недавнє доповнення до POSIX (все ще необов’язкове для POSIX: 2004). Це в основному зручна для програміста версія type
: вона друкує повний шлях для виконуваного файлу $PATH
, оголене ім’я вбудованого або функції та визначення псевдоніму для псевдоніма.
exists_in_path () {
case $(command -v -- "$1") in
/*) return 0;;
alias\ *) return 1;; # alias
*) return 1;; # built-in or function
esac
}
Ksh, bash і zsh також повинні type -p
шукати лише виконувані файли в $PATH
. Зауважте, що в bash, статус повернення type -p foo
дорівнює 0, якщо foo
це вбудована функція; якщо ви хочете протестувати виконуваний файл у $PATH
, вам потрібно перевірити, чи вихід не порожній. type -p
відсутня в POSIX; наприклад, попіл Debian (який знаходиться /bin/sh
на Ubuntu) не має його.