Как я могу заставить ZSH загрузить мою последнюю версию Bash?

Моя текущая оболочка — 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

Просто написать свой скрипт на zsh?

Shawn 04.04.2024 21:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
167
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда ты это делаешь

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 нужно добавлять в конец.

boddhisattva 04.04.2024 17:19

Каталоги, перечисленные в 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

Другие вопросы по теме