Обновление/Ответ

Обновление/Ответ

Ладно, тут я в некотором замешательстве.

Я нахожусь в процессе глубокого погружения в BASH, с целью написания некоторых скриптов автоматизации для моего работодателя. Также, полное раскрытие здесь: я веб-парень; до сих пор я знал CLI ТОЛЬКО достаточно, чтобы работать с git.

Моя проблема в том,около половины сотрудников используют MacOS, другая половина использует GitBash, и, похоже, поддерживаются разные флаги (или, что более важно,нетподдерживается) на двух разных экземплярах BASH. Еще одна загадка: учитывая, что все работают из дома, конец света и все такое, я не могу с уверенностью требовать от каждого из наших сотрудников «перейти на дистрибутив X»/«обновиться до версии Y».

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

type foo >/dev/null 2>&1 || { echo >&2 "COMMAND NOT FOUND"; }

...и...

[ -x "$(command -v foo)" ] || echo 'COMMAND NOT FOUND'

...но в моем конкретном случае ОБЕ платформы fooустановлены, но, например, только MacOS имеет флаг-модификатор -b/ .--barИтак, как мне проверить, поддерживается ли определенная ФУНКЦИЯ команды?Каждый раз, когда я пытаюсь передать флаг одному из тестов, программа, ВЫПОЛНЯЮЩАЯ тест, похоже, считает, что он направлен на ИТ, полностью игнорирует его или выдает ошибку.

Как проверить, является ли команда foo -b/ допустимой/установленной/доступной?foo --bar

Обновление/Ответ

Поскольку общее мнение, представленное в обоснованных и, честно говоря, превосходных ответах, полученных ниже, по-видимому, представляет собой гибрид «нет, нельзя» с добавлением «просто слишком много факторов, чтобы можно было с уверенностью извлечь что-либо похожее на убедительные и полезные данные», я закрываю этот вопрос.

Моей целью было выяснить, какой подход следует использовать для проверки наличия потенциально несуществующего флага между двумя различными платформами.известенплатформы, к счастью, в моем случае — и подходящей тактикой в ​​данном случае, похоже, будет та, которую я сейчас принимаю:поддерживать два отдельных скрипта, по одному для каждой платформы.

Спасибо всем, кто нашел время ответить! Это очень ценно.

решение1

Полезным и надежным способом вы, вероятно, не сможете. По сути, вам нужно протестировать каждую команду по отдельности, чтобы увидеть, что она делает. (Команда "echo" является особенно плохим случаем этого. Существует множество вариаций.)

Что вы можете сделать, так это проверить номера версий и операционную систему.

Для BASH попробуйте

bash --version | head -1

или

bash_version="$( bash --version | head -1|sed -e 's/.* version //;s/ .*//' )"

или просто используйте предопределенный символ$BASH_VERSION

Для операционной системы uname -sэто хорошее начало, а другие варианты могут предоставить вам более подробную информацию.

Получив все это, вы можете приступить к написанию условного кода по мере необходимости.

Сказав все это... для вашего конкретного случая команды foo, которая может или не может принимать --bar опцию: выясните, что две версии делают с совпадающими командными строками, которые в противном случае можно безопасно запустить. Например, если обе версии сообщают о fooпервой недопустимой опции, попробуйте написать что-то вроде:

output="$( foo --bar --somethingtotallyinvalid 2>&1 )"

и затем выяснить, что находится в переменной output. Конечно, в этом случае это, вероятно, будет допустимый список опций. Если это так, вы можете рассмотреть:

output="$( foo --somethingtotallyinvalid 2>&1 | grep -e --bar )"

Связанный контент