Можно ли добавить псевдоним для того, какую версию bash следует использовать, если в заголовке сценария оболочки указан #! / Bin / bash? - PullRequest
1 голос
/ 07 июня 2019

Я использую MacOS и iTerm2.В настоящее время у меня настроен iTerm2 для использования другой версии bash, установленной вместе с brew (версия bash 4.4, которая изначально не поставляется с MacOS).Я могу проверить это, запустив echo $BASH_VERSION и получив 4.4.23(1)-release в качестве вывода.

У меня есть огромный bash-скрипт, который я хочу запустить, но в заголовке определено #! /bin/bash.По какой-то причине, когда я запускаю скрипт, используется собственная версия bash (версия 3.2), которая находится по этому пути.

Я не хочу менять этот заголовок, потому что мы запускаем скрипткак в рабочей среде, так и в среде разработки (наиболее важно то, что она работает на производственных серверах, работающих под управлением Linux).Пока что локально я изменил его на / usr / local / bin / bash, чтобы он работал, но он будет генерировать diff-ы в моем потоке git.

Можно ли добавить псевдоним или аналогичный в iTerm?что переводит /bin/bash в /usr/local/bin/bash, или аналогичный трюк?

Ответы [ 2 ]

2 голосов
/ 07 июня 2019

Вы можете изменить шебанг на #! /usr/bin/env bash. Этот шебанг должен работать и в других системах.

Единственное отличие состоит в том, что env bash будет искать PATH в вашем bash вместо точного /bin/bash. Настройте PATH на Mac, чтобы он указывал на новую версию bash.

Чтобы убедиться, что у вас правильная версия, вы можете добавить проверку в начале вашего скрипта; что-то вроде

#! /usr/bin/env bash

versionLt() { [ "$(printf %s\\n "$@" | sort -V | head -n1)" = "$1" ]; }
if versionLt "$BASH_VERSION" 4.4; then
    echo "Required bash 4.4 or higher but found bash $BASH_VERSION"
    exit 2
fi

Можно даже перезапустить сценарий с другим интерпретатором, если у вас есть путь к этому интерпретатору. Аргументы и stdin будут сохранены.

exec /path/to/new/version/of/bash "$0" "$@"

Вы можете перебрать список возможных путей и попытаться найти правильную версию, но я думаю, что использование evn bash и установка PATH - это путь.

2 голосов
/ 07 июня 2019

быстрый и грязный

Почему бы не вызвать bash direct и ваш скрипт в качестве параметра?

/usr/local/bin/bash your_special_production_script.sh
...