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

81

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

echo $BASH_VERSION
3.2.57(1)-release

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

Слуйс
источник
3
Там нет необходимости делать это. На самом деле, это всегда хорошая идея сохранить оригинал. Две или более версии bash могут быть установлены одновременно, и вы можете установить ту, которая вам нравится по умолчанию
lupincho
По сути, Apple Software Update будет отвечать за изменение версии BASH в системе, как это было с обновлением BASH для Shellshock. Так что, если Apple не предоставит обновление, то не будет прямого способа обновить его до последней версии GNU BASH, которая была установлена ​​как часть OS X. Косвенным способом было бы загрузить его самостоятельно, тем или иным способом, и установить его и затем установите его в качестве оболочки по умолчанию. Независимо от того, решите вы удалить удаленную версию или обновленную версию Apple, решать вам.
user3439894

Ответы:

36

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

Рекомендации:

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

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

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

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

Можно ли реально обновить 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 (РЕДАКТИРОВАТЬ: я еще не нашел способ CLI, который работает)

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

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

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

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

Как сказал @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 (при условии, что на вашем пути находится корзина с домашним пивом). Тем не менее, это еще не ваша оболочка по умолчанию. Вы можете найти, где он находится, запустив which bash. В моем случае это на /usr/local/bin/bash.

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

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

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

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

Это будет использовать первый удар по PATH.

#!/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 Terminal , но фактическая команда очень проста.

chsh -s /usr/local/bin/bash

Теперь новый bash является нашей оболочкой входа по умолчанию. Если вы откроете Terminal или 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>
studgeek
источник
2
Основываясь на статье / ветке, на которую он ссылался, я думаю, что он действительно имел в виду «не по умолчанию», говоря не бок о бок. Мой ответ делает 4 по умолчанию, поэтому 3 больше не виден. Тот факт, что старый bash все еще занимает некоторое место на диске, не кажется мне большой проблемой.
Studgeek
1
+1 мной. Да, OP не хочет этого, но вопрос принадлежит сообществу, и если это помогает другим людям, круто. Он может не получить чек, поскольку ответ выбирает OP, но это не делает его плохим ответом.
bmike
3
На High Sierra sudo chpass -s /usr/local/bin/bashменяет мою оболочку только для root / sudo . Чтобы изменить свой обычный вход в систему, я должен запустить команду без sudo. Это может быть вещь Active Directory; Я не уверен.
Брэд Сзонье
1
Вместо использования #!/usr/local/bin/bashшебанга, посмотрите на использование #!/usr/bin/env bash( объяснение ). Это запустит скрипт с любой версией bash, доступной для среды, которая запускает скрипт, то есть с любой вернувшейся версией which bash. Это более портативное решение, использующее определенные пути. Мы не можем ожидать, что другие пользователи установят bash через homebrew.
Илья Москвин
1
@IllyaMoskvin, я изначально использовал определенный путь, потому что я хотел показать, как использовать его явно. Я обновил примеры, чтобы иметь оба.
Studgeek
0

Вы можете установить другую версию 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"
Рапозо
источник
-1

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

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

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

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

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

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

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

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

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

Feuda
источник
1
Кто проголосовал за мой ответ без объяснения причин?
Феуда