Я работаю в относительно гетерогенной среде, где я могу использовать разные версии Bash на разных узлах HPC, виртуальных машинах или моей личной рабочей станции. Поскольку я помещаю свои сценарии входа в Git-репозиторий, я хотел бы использовать один и тот же (ish) .bashrcпо всем направлениям, без большого количества «если этот хост, то ...» - типа беспорядка.
Я как поведение по умолчанию Bash ≤ 4.1, расширяющегося cd $SOMEPATHв cd /the/actual/pathпри нажатии на Tabклавишу. В Bash 4.2 и выше вам нужно было shopt -s direxpandбы повторно включить это поведение, которое не было доступно до 4.2.29 . Это всего лишь один пример; другая, возможно связанная с этим shoptопция complete_fullquote(хотя я точно не знаю , что она делает) также могла изменить поведение по умолчанию в v4.2.
Тем direxpandне менее, это не распознается в более ранних версиях Bash, и, если я попытаюсь сделать это shopt -s direxpandв своей .bashrc, это приведет к тому , что сообщение об ошибке будет выводиться на консоль каждый раз, когда я вхожу в узел с более старой версией Bash:
-bash: shopt: direxpand: invalid shell option name
Что я хотел бы сделать, так это обернуть условное окружение, shop -s direxpandчтобы активным образом включить эту опцию в Bash> 4.1, не раздражая старые версии Bash ( т.е. не просто перенаправляя вывод ошибок в /dev/null).
.bashrc. Я все еще хотел записать, как использовать $BASH_VERSINFOдля опроса основную / младшую версию работающей оболочки, для моего собственного назидания, поэтому я закончил публиковать свой собственный ответ. :)