Иногда надо заставить пользователя выполнить скрипт именно в Bash-шелле. Не в sh, не в dash, не в zsh и не в fish, а именно в Bash, чтобы гарантированно сработали все башизмы. Как это можно обеспечить?
Прописывание Bang-строки #!/bin/bash не решает эту проблему: всегда можно запустить скрипт в другом шелле, например вызвав команду dash скрипт.sh. Каково же решение? Можно воспользоваться нижеприведенным кодом:
$ cat test_bash.sh
#!/bin/bash
[ -n "$BASH_VERSION" ] || { echo "Please run this script with bash"; exit 1; }
echo "Начинается работа bash-скрипта"
Разультат работы будет следующим:
$ ./test_bash.sh
Начинается работа bash-скрипта
$ bash test_bash.sh
Начинается работа bash-скрипта
$ sh test_bash.sh
Please run this script with bash
В скрипте используется тот факт, что при выполнении скрипта в Bash, всегда существует переменная $BASH_VERSION и она не пустая. В других шеллах эта переменная отсутсвует. Этот факт проверяется условием в квадратных скобках (if не пишется, а скобки являются алиасом утилиты test). В случае если нет переменной $BASH_VERSION, считается, что скрипт запущен не в Bash, и тогда будет выдано предупреждение и работа скрипта завершится.