Моя текущая оболочка — ZSH, и по умолчанию она использует Bash версии 3.2.x. У меня макос Сонома версии 14.3.1.
Для одной из команд оболочки, которую я пытаюсь запустить, в настоящее время я получаю следующую ошибку:
unbound variable
и для этого требуется использовать версию bash >=4 для использования функциональности с associative arrays
.
Я установил последнюю версию bash
с помощью brew
, и в настоящее время она доступна по этому пути:
/opt/homebrew/Cellar/bash/5.2.26/bin/bash
В моем .zshrc
я пытаюсь добавить export PATH = "$PATH:/opt/homebrew/Cellar/bash/5.2.26/bin"
как способ добавить путь к последней версии bash, которую я хочу использовать.
Но когда я это делаю bash --version
, я все равно получаю 3.2.57:
➜ ~ bash --version
GNU bash, version 3.2.57(1)-release (arm64-apple-darwin23)
Copyright (C) 2007 Free Software Foundation, Inc.
Как настроить ZSH для загрузки/использования последней версии bash для устранения ошибки unbound variable
?
Мой /etc/shells
выглядит так, как показано ниже (я обновил его, добавив последнюю версию bash, установленную через Brew):
/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/opt/homebrew/bin/bash
/opt/homebrew/Cellar/bash/5.2.26/bin/bash
Когда ты это делаешь
export PATH = "$PATH:/opt/homebrew/Cellar/bash/5.2.26/bin"
вы делаете свой новый каталог ПОСЛЕДНИМ местом для поиска экземпляра bash
, вы должны были это сделать
export PATH = "/opt/homebrew/Cellar/bash/5.2.26/bin:$PATH"
вместо этого сделать его первым каталогом, иначе какая-либо существующая версия bash
будет обнаружена всем, кто просматривает ваш PATH
.
Кроме того, убедитесь, что в вашем скрипте есть значок #!/usr/bin/env bash
в верхней части скрипта:
#!/usr/bin/env bash
echo "$BASH_VERSION" >&2 # just so you can see which version is used
...
так что на самом деле это выглядит в вашем PATH
вместо bash
.
Спасибо, Эд, за ваш ответ и особенно за объяснение, почему $PATH нужно добавлять в конец.
Каталоги, перечисленные в PATH, проверяются слева направо, и первое совпадение выигрывает. Поэтому размещение каталога bash в конце вашего PATH не сильно поможет.
Однако, если у вас есть сценарий, для которого требуется определенная версия bash, я бы вообще не полагался на переменную PATH. Либо я бы использовал строку #!
для сценария, указывающую на желаемую версию bash, сделал бы сценарий исполняемым, а затем запустил бы его только с помощью SCRIPTNAME
. Или, альтернативно, не обращайте внимания на #!
и выполните скрипт с помощью
/opt/homebrew/Cellar/bash/5.2.26/bin/bash SCRIPTNAME
Поскольку это неудобно печатать, вы можете рассмотреть возможность использования символических ссылок:
ln -s /opt/homebrew/Cellar/bash/5.2.26/bin/bash /usr/local/bin/bash5
а затем (при разумном предположении, что у вас есть /usr/local/bin в вашем PATH) запустите его с помощью
bash5 SCRIPTNAME
Просто написать свой скрипт на zsh?