Каков наилучший способ определить (из скрипта), установлено ли программное обеспечение?

9

Я был разочарован прежде различием в выводе whichкоманды на разных платформах (Linux vs. Solaris vx. OS X), с разными оболочками, возможно, также играющими на этом. typeбыла предложена в качестве лучшей альтернативы, но насколько портативной это будет?

В прошлом я писал функции, которые анализируют вывод whichи обрабатывают различные варианты использования, с которыми я столкнулся. Они работают на машинах, которыми я пользуюсь, и это нормально для моих личных сценариев, но это кажется ужасно ненадежным для программного обеспечения, которое я собираюсь опубликовать где-то для использования другими.

Чтобы взять только один возможный пример, предположим, что мне нужно из скрипта определить, доступны ли bash и zsh на машине, а затем выполнить команду с zsh, если он присутствует, и с bash, если zsh нет, и bash достаточно версия не имеет конкретной ошибки. Большая часть остальной части скрипта может быть оболочкой Bourne, Ruby или чем-то еще, но эту особую вещь (AFAIK) необходимо выполнить с помощью zsh или последней версии bash.

Могу ли я рассчитывать на typeдоступность на разных платформах? Есть ли какая-то другая альтернатива, на whichкоторую можно легко и последовательно ответить на вопрос, установлено ли конкретное программное обеспечение?

(Если вы хотите также поделиться идеями, относящимися к примеру, который я привел, это здорово, но я в основном просто спрашиваю об общем случае: какой самый надежный способ выяснить, установлена ​​ли конкретная вещь на данном компьютере? ?)

иконоборец
источник

Ответы:

10

В 21-м веке, особенно если вы ориентируетесь на машины, которые могут иметь bash или zsh, вы можете рассчитывать на typeих доступность. (Он не существовал в чрезвычайно старых единицах, как в 1970-х или начале 1980-х годов.) Вы не можете рассчитывать на его вывод, означающий что-либо, но вы можете рассчитывать на его возвращение 0, если есть команда с таким именем и ненулевое в противном случае.

whichне является стандартным и ненадежным на практике . typeэто рекомендуемая альтернатива. whereisстрадает от тех же проблем, что whichи реже. whenceспецифично для ksh и zsh.

Когда это возможно, было бы более надежно проверить наличие команды и проверить, выглядит ли ее поведение разумным. Например, проверьте наличие подходящей версии bash, запустив bash -c 'somecommand', например,

# Test for the `-v` operator (which appeared in bash 4.2)
if bash -c 'test -v HOME' 2>/dev/null; then 

Сегодня вы можете рассчитывать почти на все в спецификации Singe UNIX версии 2 (за исключением экзотических вещей, таких как Fortran и SCCS, которые в любом случае являются необязательными). Вы также можете рассчитывать на большую часть версии 3 , но это еще не до конца реализовано. Поддержка версии 4 упрощена. Если вы собираетесь читать эти спецификации, я рекомендую прочитать версию 3, которая намного более читабельна и менее двусмысленна, чем версия 2.

Для примеров того, как определить системные особенности, посмотрите на autoconf и на configureскрипты различного программного обеспечения.

См. Также Ресурсы для программирования переносимой оболочки для получения дополнительных советов.

Жиль "ТАК - перестань быть злым"
источник
Для этого может быть полезно расширение для комментирования часто рекомендуемых методов с использованием hashи command -v.
Калеб
@Caleb Для целей этого вопроса я не вижу выгоды от command -vover type, все, что нам нужно, это логический результат. К каким «общепринятым методам использования hash» вы обращаетесь?
Жиль "ТАК - перестать быть злым"