Как проверить, существует ли программа из Bash-скрипта?
Как я могу проверить, существует ли программа, так чтобы в случае её отсутствия вернуть ошибку и завершить выполнение скрипта, или продолжить выполнение в случае, если программа найдена?
Это, казалось бы, должно быть просто, но у меня возникли сложности.
5 ответ(ов)
Это зависит от того, хотите ли вы узнать, существует ли программа в одной из директорий переменной $PATH
, или вы уже знаете ее абсолютный путь. Если вам нужно проверить, есть ли программа в переменной $PATH
, используйте следующий код:
if which programname >/dev/null; then
echo существует
else
echo не существует
fi
В противном случае, если у вас есть абсолютный путь к программе, используйте:
if [ -x /path/to/programname ]; then
echo существует
else
echo не существует
fi
Перенаправление >/dev/null
в первом примере подавляет вывод программы which
.
У меня есть функция, определенная в моем файле .bashrc, которая упрощает это. Вот код функции:
command_exists () {
type "$1" &> /dev/null ;
}
Пример того, как она используется (из моего файла .bash_profile):
if command_exists mvim ; then
export VISUAL="mvim --nofork"
fi
Здесь функция command_exists
проверяет, существует ли команда, переданная ей в качестве аргумента. Если команда mvim
доступна, то переменная окружения VISUAL
устанавливается в mvim --nofork
. Таким образом, вы можете легко управлять настройками и условиями выполнения в вашем терминале.
Расширяя Ответы @lhunath и @GregV, вот код для тех, кто хочет легко выполнить такую проверку в условии if
:
exists()
{
command -v "$1" >/dev/null 2>&1
}
Вот как это использовать:
if exists bash; then
echo 'Bash установлен!'
else
echo 'На вашей системе нет Bash'
fi
Таким образом, вы сможете проверить наличие нужной команды в системе.
Команда -v
работает корректно, если для <command>
, которую вы тестируете, установлена опция POSIX_BUILTINS, но может не сработать в противном случае. У меня она работала многие годы, но недавно я столкнулся с ситуацией, когда это не сработало.
Я считаю следующую конструкцию более надежной:
test -x "$(which <command>)"
Поскольку она проверяет три аспекта: путь, существование и права на выполнение.
Вариантов здесь действительно много, но меня удивило, что не было быстрых однострочников. Вот что я использовал в начале своих скриптов:
[[ "$(command -v mvn)" ]] || { echo "mvn не установлен" 1>&2 ; exit 1; }
[[ "$(command -v java)" ]] || { echo "java не установлен" 1>&2 ; exit 1; }
Это основано на выбранном ответе здесь и еще одном источнике.
Извлечение имени файла и расширения в Bash
Как изменить цвет вывода echo в Linux
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как работает "cat << EOF" в bash?
Передача параметров в функцию Bash