Использование type commandname
. Возвращает true, если commandname
выполняется что-либо: псевдоним, функция, встроенная или внешняя команда (ищется в $PATH
). В качестве альтернативы используйте use, command commandname
который возвращает true, если commandname
это встроенная или внешняя команда (ищется в $PATH
).
exists () {
type "$1" >/dev/null 2>/dev/null
}
Есть несколько вариантов sh (определенно pre-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) его нет.