31

Как проверить, существует ли программа из Bash-скрипта?

12

Как я могу проверить, существует ли программа, так чтобы в случае её отсутствия вернуть ошибку и завершить выполнение скрипта, или продолжить выполнение в случае, если программа найдена?

Это, казалось бы, должно быть просто, но у меня возникли сложности.

5 ответ(ов)

1

Это зависит от того, хотите ли вы узнать, существует ли программа в одной из директорий переменной $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.

1

У меня есть функция, определенная в моем файле .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. Таким образом, вы можете легко управлять настройками и условиями выполнения в вашем терминале.

0

Расширяя Ответы @lhunath и @GregV, вот код для тех, кто хочет легко выполнить такую проверку в условии if:

exists()
{
  command -v "$1" >/dev/null 2>&1
}

Вот как это использовать:

if exists bash; then
  echo 'Bash установлен!'
else
  echo 'На вашей системе нет Bash'
fi

Таким образом, вы сможете проверить наличие нужной команды в системе.

0

Команда -v работает корректно, если для <command>, которую вы тестируете, установлена опция POSIX_BUILTINS, но может не сработать в противном случае. У меня она работала многие годы, но недавно я столкнулся с ситуацией, когда это не сработало.

Я считаю следующую конструкцию более надежной:

test -x "$(which <command>)"

Поскольку она проверяет три аспекта: путь, существование и права на выполнение.

0

Вариантов здесь действительно много, но меня удивило, что не было быстрых однострочников. Вот что я использовал в начале своих скриптов:

[[ "$(command -v mvn)" ]] || { echo "mvn не установлен" 1>&2 ; exit 1; }
[[ "$(command -v java)" ]] || { echo "java не установлен" 1>&2 ; exit 1; }

Это основано на выбранном ответе здесь и еще одном источнике.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь