Обновите bash до версии 4.0 на OSX

Можно ли на самом деле обновить bash до версии 4.0 в OSX Yosemite?

echo $BASH_VERSION
3.2.57(1)-release

Эта статья и этот поток относятся к одному и тому же вопросу, но они устанавливают новую оболочку рядом со старой. Есть ли способ напрямую обновить старую оболочку bash?

В этом нет необходимости. На самом деле всегда лучше оставить оригинал. Две или более версии bash могут быть установлены одновременно, и вы можете установить любую из них по умолчанию.
По сути, обновление программного обеспечения Apple будет отвечать за изменение версии BASH в системе, как это было с обновлением BASH для Shellshock. Таким образом, если Apple не предоставит обновление, то нет прямого способа обновиться до последней версии GNU BASH, которая была установлена ​​как часть OS X. Косвенным способом было бы загрузить его самостоятельно тем или иным способом, установить его и затем установите его в качестве оболочки по умолчанию. Независимо от того, решите ли вы удалить поставляемую версию или обновленную версию Apple, это зависит от вас.
Для всех, кто, как и я, приходит сюда из Google, начиная с macOS Catalina (10.15), вы можете довольно легко установить оболочку по умолчанию на zsh. zsh будет оболочкой по умолчанию в macOS в будущем. Много схожих функций с bash. И самое главное это актуальная версия. Шаги здесь: support.apple.com/en-us/HT208050
Вероятно, в Yosemite (10.10) вы можете, но в El Capitan (10.11) защита целостности системы support.apple.com/en-au/HT204899 не позволит вам изменить /bin и, следовательно, /bin/bash

Ответы (7)

Apple не будет обновлять Bash, потому что последняя версия находится под лицензией GPLv3, которую Apple не может использовать. Однако они обновили большинство своих других оболочек. ZSH, например, в основном обновлен.

Использованная литература:

После небольшого исследования это кажется основной проблемой:

Когда люди распространяют Пользовательские продукты, включающие программное обеспечение под GPLv3, раздел 6 требует, чтобы они предоставили вам информацию, необходимую для модификации этого программного обеспечения. Пользовательские продукты — это термин, специально определенный в лицензии; Примеры пользовательских продуктов включают портативные музыкальные проигрыватели, цифровые видеомагнитофоны и системы домашней безопасности.

Это потребовало бы, чтобы части программного обеспечения с закрытым исходным кодом, находящиеся под лицензией GPL, могли быть изменены публикой, что, очевидно, было бы проблемой для Apple.

Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат .
Это объяснение не имеет смысла. Доставка бинарного файла GPL (v3 или другого) не означает, что остальную часть ОС необходимо будет выпустить. Остальная часть ОС не связана с bash. Пункт «Tivoization» может объяснить, почему bashнельзя обновиться, скажем, на Apple TV, но не на настольном Mac. Кроме того, «части под GPL» уже должны быть доступны для изменения публикой; v3 не изменит этого. Я полагаю , что пункта о патентах GPL v3 будет достаточно, чтобы удержать Apple от прикосновения к коду GPL v3.
Почему это должно быть проблемой для Apple? Bash уже имеет открытый исходный код (все версии ≥1.14 доступны через GNU @ ftp.gnu.org/gnu/bash , а версия, включенная в macOS (в настоящее время v3.2), доступна через Apple @ opensource.apple.com/source/bash ), но он может быть изменен в любом случае.
@ tjt263 Речь идет о различиях между GPLv3 и GPLv2, по которой версия, которую использует Apple, все еще лицензируется.
Верно, Bash3.2 находится под лицензией GPLv2. Bash4.x распространяется под лицензией GPLv3. И что? Вы сказали: «Apple не будет обновлять Bash, потому что последняя версия находится под лицензией GPLv3, которую Apple не может использовать ». Почему они не могут? «Это потребовало бы, чтобы части программного обеспечения с закрытым исходным кодом, находящиеся под лицензией GPL, могли быть изменены публикой , что, очевидно, было бы проблемой для Apple ». Почему это проблема? Они это уже делают. Это уже может быть изменено публикой. Весь софт есть. Особенно, когда это FOSS, и они раздают исходный код на своем сайте всем, кто этого хочет.
@jamesdlin Что такое пункт о патентах, который удерживает Apple от Bash 4?
@FranklinYu Хм, я точно не помню, о чем я думал, но, может быть, «вы не можете инициировать судебный процесс (включая перекрестный иск или встречный иск в судебном процессе), утверждая, что любое патентное требование нарушается путем создания, использования, продажи, предложения для продажи или импорта Программы или любой ее части"
Понижение этого. OP спрашивает, могут ли конечные пользователи обновить установленную версию bash, но этот ответ объясняет, почему Apple не поставляет MacOS с последней версией. Этот ответ не связан с вопросом ОП, который является «как», а не «почему». (Хотя, FWIW, этот ответ точно отвечает на вопрос «почему».)

Как сказал @William в своем ответе, Apple не предоставляет bash 4 из-за ограничений GPL. Однако вы можете установить bash 4+, а также сделать его оболочкой по умолчанию (в том числе для Terminal и iTerm2 ), выполнив следующие действия.

Установите Bash 4 через Homebrew

Сначала установите более новую версию bash. Есть разные способы сделать это, я предпочитаю Homebrew.

  • Установите Homebrew, как описано на http://brew.sh .
  • Установите bash с помощью brew install bash.

Bash 4 теперь доступен в вашем PATH (при условии, что корзина Homebrew находится на вашем пути). Однако это еще не ваша оболочка по умолчанию. Вы можете найти, где он находится, запустив which bash. В моем случае это на /usr/local/bin/bash.

Использование Баш 4

Так как он находится в вашем PATH, вы можете начать сеанс Bash 4 с просто bashили его можно использовать в сценариях с помощью Shebang .

Например, это будет использовать конкретный экземпляр bash.

#!/usr/local/bin/bash
...your script...

Это будет использовать первый удар в ПУТИ.

#!/usr/bin/env bash
...your script...

Вы также можете установить путь bash для определенных профилей в Terminal/iTerm2, используя шаги, описанные в ответе @user136952.

Установка Bash 4 по умолчанию

Как было сказано выше, после установки Bash 4 по-прежнему не является оболочкой по умолчанию. Чтобы сделать bash по умолчанию, вам нужно сделать еще два шага.

Во-первых, добавьте путь Bash 4 к вашему /etc/shellsфайлу, чтобы он был разрешенной оболочкой входа. Как описано в /etc/shells , этот файл содержит список допустимых оболочек входа в систему. После добавления нового пути bash мой /etc/shellsвид выглядит следующим образом:

# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/bash

Затем мы используем chsh, чтобы сделать его оболочкой по умолчанию. Таким образом, любые сеансы для этого пользователя будут использовать эту оболочку. Вы можете прочитать больше об этом в разделе «Изменение оболочки в терминале Mac OS X », но на самом деле команда очень проста.

chsh -s /usr/local/bin/bash

Теперь новый bash является нашей оболочкой входа по умолчанию. Если вы откроете Терминал или iTerm2 и запустите bash --version, вы должны увидеть новую версию. Обратите внимание на «Лицензия GPLv3+», поэтому Apple не связывает ее с macOS.

$ bash --version
GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.6.0)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
Он упомянул, что ему определенно не нужна опция установки параллельно.
Основываясь на статье/треде, на который он ссылался, я думаю, что он действительно имел в виду «не по умолчанию», говоря не бок о бок. Мой ответ делает 4 значением по умолчанию, поэтому 3 больше не видно. Тот факт, что старый bash все еще занимает место на диске, не кажется мне большой проблемой.
+1 от меня. Да, OP не хочет этого, но вопрос принадлежит сообществу, и если это поможет другим людям, отлично. Он может не получить проверку в качестве ответа, который выбирает OP, но это не делает его плохим ответом.
@studgeek, есть ли какие-либо долгосрочные побочные эффекты от того, чтобы сделать bash4 оболочкой по умолчанию для пользователя root в Mac OS X? Я запустил команду chsh, но попытаюсь запомнить, что если что-то пойдет не так, мне нужно вернуть ее обратно. Тем не менее, это помогло бы мне успокоиться, зная ответ на этот вопрос. Спасибо!
В High Sierra sudo chpass -s /usr/local/bin/bashизменяет мою оболочку только для root/sudo . Чтобы перейти на мой обычный логин, я должен запустить команду без sudo. Это может быть связано с Active Directory; Я не уверен.
Вместо того, чтобы использовать #!/usr/local/bin/bashшебанг, изучите использование #!/usr/bin/env bash( объяснение ). Это запустит скрипт с любой версией bash, доступной среде, которая запускает скрипт, т.е. с любой версией, которая which bashвозвращается. Это более портативное решение, использующее определенные пути. Мы не можем ожидать, что другие пользователи установят bash через homebrew.
@BraddSzonye Да, хороший улов. Я не должен был засовывать sudo туда. Я обновил его.
@IllyaMoskvin, я изначально использовал определенный путь, потому что хотел показать, как его использовать явно. Я обновил примеры, чтобы иметь оба.
@harperville У меня не должно было быть sudo перед chsh. Запуск его с помощью chsh просто изменяет его для текущего пользователя (что кажется более безопасным, как вы предлагаете).
@studgeek Извините, мой комментарий был нацелен на других проходящих мимо читателей, но спасибо за обновление ответа! Мне нравится этот envметод, потому что он упрощает повторное использование сценариев между macOS и Linux, например, между хостом и виртуальными машинами.
chshбыл критическим недостающим шагом для меня. Спасибо.
На шаге 1 для большинства людей после brew install bash, команда which bashпросто укажет на версию bash 3.4, установленную по умолчанию в macOS, а не на версию, которую вы только что установили с помощью homebrew.
Одним из основных моментов homebrew является то, что он устанавливает исполняемые файлы в формате /usr/. Выполнение sudoи редактирование /etc/shellsкажется неуместным, это было бы похоже на редактирование /etc/pathsнепосредственно для всех ваших исполняемых файлов, а не в $PATHфайле .bashrc.
Я стираю, чтобы моя оболочка по умолчанию оставалась zsh. Но я хочу использовать новые версии bash для своего сценария bash. Возможно ли это на Mac?
Хорошее пошаговое руководство от 2019 года также можно найти по адресу itnext.io/upgrading-bash-on-macos-7138bd1066ba.

Можно ли на самом деле обновить bash до версии 4.0 в OSX Yosemite? Да.

  1. Загрузите/установите homebrew http://brew.sh/ , выполнив эту команду в терминале.

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    
  2. Выйдите и снова откройте терминал. затем введите

    brew install bash
    
  3. Измените оболочку по умолчанию через графический интерфейс терминала, указав буквальный путь к вашему новому bash (EDIT: мне еще предстоит найти работающий способ CLI)

введите описание изображения здесь

Можно ли на самом деле обновить bash до версии 4.0 , предоставленной Apple, в OSX Yosemite?

РЕДАКТИРОВАТЬ: Нет. Не так, как спрашивает оператор. Например, обновите текущую установку, заменив себя. В других ответах было отмечено, что Apple не обновляла bash из-за проблем с лицензированием. Однако загрузка обновленной и отдельной версии bash и использование ее в качестве оболочки по умолчанию является каноническим решением для большинства интерпретаторов. Возьмем, к примеру, питон. Вы не обновляете 2.7 до 3.5, вы загружаете отдельную версию и меняете свою по умолчанию.

Вы можете установить значение по умолчанию через CLI с помощью: sudo chpass -s /usr/local/bin/bash. Примечание. Лучше всего указывать символическую ссылку /usr/local/bin/, чтобы Brew мог обрабатывать обновления без необходимости каждый раз менять среду.
каковы риски использования оболочки, отличной от Apple?
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'затем chsh -s /usr/local/bin/bashустановит оболочку по умолчанию для терминала
@ 3pitt При установке более новой bashверсии очень мало риска, /usr/local/bin/bashпотому что она оставляет систему в /bin/bashпокое. Таким образом, любые системные зависимости bash 3будут сохранены.

Вы можете установить другую версию Bash без доморощенного

  • Перейти к GNU Bash
  • Загрузите нужную версию ( здесь )
  • И следуйте инструкциям здесь: https://gist.github.com/samnang/1759336

    Загрузите и установите нужную версию bash. Замените XX (в bash-XX) на нужную версию, например 4.4.

    curl -O http://ftp.gnu.org/gnu/bash/bash-X.X.tar.gz
    tar xzf bash-X.X.tar.gz
    cd bash-X.X
    ./configure --prefix=/usr/local && make && sudo make install
    

    Добавьте новую оболочку в список допустимых оболочек.

    sudo bash -c "echo /usr/local/bin/bash >> /private/etc/shells"
    

    Сменить оболочку для пользователя

    chsh -s /usr/local/bin/bash
    

    Проверьте наличие Bash 4 и /usr/local/bin/bash...

    echo $BASH && echo $BASH_VERSION
    

    Вы можете добавить псевдоним, если хотите, чтобы команда bash использовала его. Поместите в свой ~/.bash_profile

    alias bash="/usr/local/bin/bash"
    
Это кажется мне хорошим подходом, но я задаюсь вопросом: почему бы просто не заменить антиквариат /bin/bash? Это потому, что это необходимо для совместимости с другим «старинным» программным обеспечением, которое Apple распространяет в MacOS?
Это сбросит все каталоги установки в /usr/local. Если вы предпочитаете, чтобы они были организованы в bash-X.Xкаталоге, добавьте /bash-X.Xк параметру префикса в ./configureкоманде.
@Seamus, вам не разрешено изменять /binкаталог, если вы не отключите файлы SIP.

Параллельная установка с обновлением вашей оболочки (через chsh или графический интерфейс) не будет работать для скриптов. Сценарии часто используют env bash, который возвращается к версии OS X bash. Таким образом, вам может понадобиться не полное обновление bash, а параллельная установка , которая всегда возвращает более новую версию bash (т.е. даже при envвызове).

Итак, чтобы справиться с этим:

1) установить bash через Homebrew, как писали другие комментаторы

2) установите для своей оболочки входа в эту новую версию (через графический интерфейс или команду chsh, как писали другие)

3) установите /usr/local/bin(или путь к новой версии bash) перед /binвашей переменной $PATH, добавив это в свой ~/.bash_profile:export PATH=/usr/local/bin:$PATH

Это сломает сценарии, которые ожидают bash версии 3, т. е. сценарии, предоставленные Apple, вам нужно использовать sde рядом.
Справедливое замечание. Езжу так уже некоторое время и никаких проблем. Возможно, Apple предоставляет полный путь в своих сценариях или просто не попала в ловушку. Для сценариев уровня системы Apple, то есть не из оболочки, он в любом случае никогда не вызывает .bash_profile, поэтому в любом случае это повлияет только на то, что вы запускаете непосредственно в терминале.
@Mark Я не могу вспомнить случай, когда v ≥4.x сломал бы скрипт, написанный для v ≤3.x. Ты можешь?

2019: Все просто, как в этом посте

$ brew install bash
$ sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'
$ chsh -s /usr/local/bin/bash

затем откройте новый терминал, наслаждайтесь!

Кто проголосовал за мой ответ без объяснения причин?
Вероятно, за него проголосовали, потому что это дубликат этого apple.stackexchange.com/a/193413/333802 плюс комментарии .

Для компьютеров Mac M1 -

Вы можете обновить bash, выполнив

brew install bash

при условии, что у вас уже есть Home-brew. Это установит последнюю версию bash. Вы можете проверить установку, запустив -

brew info bash

Чтобы обновить оболочку, просто перезапустите терминал и проверьте версию bash, используя -

bash --version

Надеюсь это поможет.

Отличается ли это от ответа для Intel Mac? Кроме того, шаг 1 должен быть «установить доморощенный».
Я не работал с Intel Mac, но у M1 более старая версия bash, поэтому я поместил это здесь. Кроме того, в моем ответе упоминается «при условии, что homebrew установлен».