Если вы просто хотите проверить, что вы используете (определенную версию) Bash,
лучший способ сделать это - использовать переменную массива $BASH_VERSINFO
.
Как переменная массива (только для чтения) она не может быть установлена в среде,
так что вы можете быть уверены, что он идет (если вообще) из текущей оболочки.
Однако, поскольку Bash имеет другое поведение при вызове как sh
,
вам также нужно проверить, что переменная окружения $BASH
оканчивается на /bash
.
В написанном мной сценарии, использующем имена функций с -
(не подчеркивание)
и зависит от ассоциативных массивов (добавлено в Bash 4),
У меня есть следующая проверка работоспособности (с полезным сообщением об ошибке пользователя):
case `eval 'echo $BASH@${BASH_VERSINFO[0]}' 2>/dev/null` in
*/bash@[456789])
# Claims bash version 4+, check for func-names and associative arrays
if ! eval "declare -A _ARRAY && func-name() { :; }" 2>/dev/null; then
echo >&2 "bash $BASH_VERSION is not supported (not really bash?)"
exit 1
fi
;;
*/bash@[123])
echo >&2 "bash $BASH_VERSION is not supported (version 4+ required)"
exit 1
;;
*)
echo >&2 "This script requires BASH (version 4+) - not regular sh"
echo >&2 "Re-run as \"bash $CMD\" for proper operation"
exit 1
;;
esac
Вы могли бы опустить несколько параноидальную функциональную проверку для функций в первом случае,
и просто предположим, что будущие версии bash будут совместимы.