Оновлення bash до версії 4.0 на OSX


55

Чи можна насправді оновити bash до версії 4.0 в OSX Yosemite?

echo $BASH_VERSION
3.2.57(1)-release

Це статті і це нитка зверніться до того ж самого питання, але вони встановлюють нову оболонку пліч-о-пліч зі старою. Чи є спосіб безпосередньо оновити стару оболонку bash?


3
Немає необхідності робити це. Насправді, це завжди гарна ідея зберегти оригінальний. Можна встановити дві або більше версій bash одночасно, і ви можете встановити будь-яку з них, які ви бажаєте бути стандартною
lupincho

По суті, оновлення програмного забезпечення Apple відповідає за зміну версії BASH в системі, як це було зроблено з оновленням до BASH для Shellshock. Отже, якщо Apple не надає оновлення, то немає жодного прямого способу оновлення до останньої версії GNU BASH, яка була встановлена ​​як частина OS X. Непрямим способом було б завантажити його самостійно, одним чи іншим способом, і встановити його та потім встановіть його як типову оболонку. Незалежно від того, чи ви вирішите видалити завантажену версію чи оновлену версію Apple, це залежить від вас.
user3439894

Відповіді:


29

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

Посилання:

Після декількох досліджень це виглядає як основна проблема:

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

Це вимагає, щоб інше програмне забезпечення із закритим вихідним кодом, частки GPL, було змінено для громадськості, що, очевидно, було б проблемою для Apple.


Коментарі не для розширеного обговорення; Ця розмова була переміщено до чату .
bmike

3
Це пояснення не має сенсу. Доставка бінарного файла GPL (v3 або інше) не означає, що решту ОС потрібно буде випустити. Решта ОС ні посилання до bash. Застереження "Tivoization" може пояснити чому bash не можна оновлювати, скажімо, Apple TV, але не на робочому столі Mac. Крім того, "частини GPL" вже повинні бути змінені для громадськості; v3 не змінить цього. I повірив би що патенти Положення GPL v3 було б достатньо, щоб утримати Apple від торкання GPL v3 коду.
jamesdlin

Чому це було б проблемою для Apple? Bash вже відкритий код (всі версії ≥1.14 доступні через GNU @ ftp.gnu.org/gnu/bash & amp; версія, що входить до складу macOS (в даний час v3.2) доступна через Apple @ opensource.apple.com/source/bash ), але він може бути змінений незалежно.
tjt263

@ tjt263 Мова йде про відмінності між GPLv3 і GPLv2, які використовує версія Apple, досі ліцензована.
William T Froggard

Право, Bash3.2 ліцензовано під GPLv2. Bash4.x ліцензовано під GPLv3. І що? Ти сказав: "Apple не буде оновлювати Bash, тому що остання версія ліцензована під GPLv3, яка Apple не може використовувати . Чому вони не можуть? "Це вимагатиме, щоб в іншому випадку програмне забезпечення із закритим вихідним кодом було створено змінюється громадськістю , Що б явно є проблемою для Apple . Чому це є проблемою? Вони це роблять вже. Це вже змінюється громадськістю. Все програмне забезпечення є. Особливо, коли це FOSS і вони роздають вихідний код на своєму сайті будь-кому, хто цього хоче.
tjt263

44

Чи можна насправді оновити bash до версії 4.0 в OSX Yosemite? Так.

  1. Завантажити / встановити доморощену http://brew.sh/ запустивши цю команду в терміналі.

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

    brew install bash
    
  3. Змініть оболонку за промовчанням через термінал gui з літеральним шляхом вашого нового bash (EDIT: я ще не знайшов спосіб CLI, який працює)

enter image description here

Чи можна насправді оновити bash на Apple надає bash версії 4.0 в OSX Йосеміті?

EDIT: Ні. E. Оновити поточну інсталяцію за допомогою самої заміни. У інших відповідях було зазначено, що Apple не оновлювала bash через проблеми ліцензування. Однак завантаження оновленої та окремої версії bash та використання її як оболонки за замовчуванням є канонічним рішенням для більшості інтерпретаторів. Візьміть, наприклад, python. Ви не оновлюєте 2,7 до 3,5, ви завантажуєте окрему версію і змінюєте стандартну.


9
Типово можна встановити за допомогою CLI: sudo chpass -s /usr/local/bin/bash. Примітка: Краще вказати на символічну посилання в /usr/local/bin/ таким чином Brew може обробляти оновлення без необхідності кожного разу змінювати середовище.
sansSpoon

які ризики виникнення з оболонкою не Apple?
Mike Palmice

1
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells' потім chsh -s /usr/local/bin/bash встановить оболонку за замовчуванням для терміналу
Abhijit Sarkar

29

Як сказав у своїй відповіді @William, Apple не надає bash 4 через обмеження GPL. Ви можете встановити bash 4+, але також можете зробити це за замовчуванням оболонки (в тому числі для терміналів і 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 лише за допомогою bash або може використовуватися в скриптах за допомогою a Шебанг .

Наприклад, для цього буде використано конкретний приклад bash.

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

Це буде використовувати перший bash на 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 , але фактична команда дуже проста.

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>

Він згадав, що він спеціально не хоче встановлювати опціонально.
William T Froggard

2
На підставі статті / потоку, з якою він пов'язаний, я думаю, що він дійсно мав на увазі "не за замовчуванням", кажучи не пліч-о-пліч. Моя відповідь робить 4 типовим, так що 3 більше не видно. Той факт, що старий баш все ще займає місце на диску, мені не здається великою проблемою.
studgeek

1
+1 від мене. Так, ОП не хоче цього, але питання належить суспільству, і якщо це допомагає іншим людям, це дивно. Вона може не отримати чек як відповідь, яку обирає ОП, але це не робить його поганою відповіддю.
bmike

3
На Високій Сьєррі, sudo chpass -s /usr/local/bin/bash змінює мою оболонку для root / sudo тільки. Щоб змінити звичайний вхід, потрібно виконати команду без sudo. Це може бути річ Active Directory; Я не впевнений.
Bradd Szonye

1
@IllyaMoskvin, я спочатку використовував конкретний шлях, тому що я хотів показати, як його використовувати явно. Я оновив приклади, щоб мати обидва.
studgeek

0

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

  • Йти до GNU Bash
  • Завантажте потрібну версію ( тут )
  • І виконайте наступні дії: https://gist.github.com/samnang/1759336

    Завантажте та встановіть потрібну версію bash Замініть X.X (у bash-X.X) на потрібну версію, наприклад, 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 або графічний інтерфейс) не буде виконана для сценаріїв. Сценарії часто використовують 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


Це призведе до порушення сценаріїв, які очікують bash версії 3 - тобто сценаріїв, що постачаються компанією Apple, - вам потрібно використовувати sde side
Mark

Справедливий момент. Протягом деякого часу працює так, і проблем немає. Можливо, Apple надає повний шлях у своїх сценаріях, або він просто не потрапив у перешкоду. Для скриптів системного рівня Apple, тобто не з оболонки, вона ніколи не викликає .bash_profile так чи інакше, так що це вплине тільки на те, що ви запускаєте безпосередньо в терміналі.
cwingrav

@ Mark Я не можу думати про примірник, де v ≥4.x зламав би скрипт, написаний для v ≤3.x. Ти можеш?
tjt263
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.