Когда вы вызываете команду из сценария оболочки в Linux, рекомендуется проверить, существует ли она в системе, на которой выполняется сценарий. Это поможет вам избежать ошибок и предотвратить завершение сценария. Таким образом, если команда не существует, вы сможете продолжить выполнение сценария без прерывания. В этой статье мы узнаем, как проверить, существует ли программа в сценарии оболочки.
Как проверить, существует ли программа в Bash
Вы можете легко проверить, существует ли команда или нет, используя ключевое слово command. Вот его синтаксис.
1 | command -v [программа] |
Приведенная выше команда возвращает true, если команда, указанная после опции -v, существует, в противном случае она вернет false.
Например, если вы хотите проверить, существует команда или нет, и вывести сообщение об ошибке, если команда не существует.
1 2 3 4 5 | if ! command -v [программа] &> /dev/null then echo "[программа] не может быть найдена" exit fi |
Кроме того, вы можете использовать команды hash и type, чтобы проверить, существуют ли команды и инструменты Linux или нет.
Для обычных команд.
1 | hash [программа] |
Или... Для проверки встроенных модулей и ключевых слов.
1 | type [программа] |
Как правило, многие разработчики и администраторы используют команду which для проверки существования или отсутствия команды.
1 | which [программа] |
Лучше использовать команды command, hash и type вместо команды which, потому что which - это внешняя команда, а остальные три команды - внутренние. Результат внутренних команд одинаков в большинстве систем, в то время как результат внешних команд варьируется от системы к системе.
Во многих операционных системах команда which даже не возвращает статус выхода, поэтому если вы используете ее в условии if, она всегда будет иметь значение true.
Вместо этого вы можете использовать команды command, hash и type, чтобы сделать то же самое. Вот примеры команд для проверки существования команды foo в вашей системе.
1 2 3 | command -v foo >/dev/null 2>&1 || { echo >&2 "Мне требуется foo, но он не установлен. Прерываю."; exit 1; } type foo >/dev/null 2>&1 || { echo >&2 "Я требую foo, но он не установлен. Прерываю."; exit 1; } hash foo 2>/dev/null || { echo >&2 "Я требую foo, но он не установлен. Прерываю."; exit 1; } |
Вот несколько моментов, о которых следует помнить при использовании хэша, типа и команды.
POSIX четко определяет вывод команды. Поэтому вы можете смело использовать его почти во всех скриптах. Но если ваш hash bang (среда выполнения) - /bin/sh, вам следует быть осторожным с использованием hash и type, поскольку их статус выхода не очень хорошо определен POSIX.
Если ваш сценарий использует bash, то hash и type не имеют значения и оба совершенно безопасны для использования. На самом деле, type предоставляет опцию -P для прямого поиска путей к папкам, указанным в переменной PATH вашей системы, а hash автоматически хэширует путь команды для более быстрого поиска в следующий раз.
Вот простой пример запуска функции gdate, если она существует, в противном случае запускается функция date.
1 2 3 4 5 6 7 | gnudate() { if hash gdate 2>/dev/null; then gdate "$@" else date "$@" fi } |
Кроме того, вы можете использовать сторонние скрипты, такие как scripts-common, чтобы проверить, существует ли скрипт или нет. Вот его синтаксис.
1 | checkBin [программа] || errorMessage "Этот инструмент требует [программа]". Установите его, пожалуйста, а затем запустите этот инструмент снова." |
Заключение
В этой статье мы узнали, как проверить, существует ли программа или нет, и как добавить ее в условие if..else, чтобы продолжить выполнение скрипта в случае, если команда не существует.