Zaktualizuj bash do wersji 4.0 na OSX

80

Czy rzeczywiście można zaktualizować bash do wersji 4.0 w OSX Yosemite?

echo $BASH_VERSION
3.2.57(1)-release

Ten artykuł i ten wątek odnoszą się do tego samego pytania, ale instalują nową powłokę obok siebie ze starą. Czy istnieje sposób na bezpośrednią aktualizację starej powłoki bash?

sluijs
źródło
3
Nie ma takiej potrzeby. W rzeczywistości zawsze dobrym pomysłem jest zachowanie oryginalnego. Dwie lub więcej wersji bash może być zainstalowanych w tym samym czasie i możesz ustawić dowolną, którą chcesz ustawić jako domyślną
lupincho
Zasadniczo aktualizacja oprogramowania Apple byłaby odpowiedzialna za zmianę wersji BASH w systemie, podobnie jak w przypadku aktualizacji BASH dla Shellshock. Więc jeśli Apple nie dostarczy aktualizacji, nie ma bezpośredniego sposobu aktualizacji do najnowszej wersji GNU BASH, która została zainstalowana jako część OS X. Pośrednim sposobem byłoby pobranie jej samodzielnie, w ten czy inny sposób, i zainstalowanie jej oraz następnie ustaw go jako domyślną powłokę. Niezależnie od tego, czy zdecydujesz się usunąć dostarczoną wersję, czy wersję zaktualizowaną przez Apple, to zależy od Ciebie.
user3439894

Odpowiedzi:

36

Apple nie zaktualizuje Bash, ponieważ najnowsza wersja jest licencjonowana na licencji GPLv3, z której Apple nie może korzystać. Zaktualizowali jednak większość swoich innych powłok. Na przykład ZSH jest w większości aktualny.

Bibliografia:

Po krótkich badaniach wydaje się to podstawowym problemem:

Gdy ludzie dystrybuują Produkty użytkownika, które zawierają oprogramowanie zgodnie z GPLv3, sekcja 6 wymaga, aby dostarczyli ci informacje niezbędne do modyfikacji tego oprogramowania. Produkty użytkownika to termin specjalnie zdefiniowany w licencji; Przykłady Produktów użytkownika obejmują przenośne odtwarzacze muzyki, cyfrowe nagrywarki wideo i systemy bezpieczeństwa w domu.

Wymagałoby to, aby w przeciwnym razie oprogramowanie z zamkniętym kodem źródłowym mogło być modyfikowane przez społeczeństwo, co oczywiście stanowiłoby problem dla Apple.

William T Froggard
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
bmike
5
To wyjaśnienie nie ma sensu. Wysłanie pliku binarnego GPL (wersja 3 lub inna) nie oznacza, że ​​reszta systemu operacyjnego będzie musiała zostać zwolniona. Reszta systemu operacyjnego nie łączy się z bash. Klauzula „Tivoization” może wyjaśniać, dlaczego bashnie można jej zaktualizować, powiedzmy, na Apple TV, ale tak naprawdę nie na komputerze Mac. Ponadto „części objęte licencją GPL” musiałyby już zostać zmodyfikowane przez społeczeństwo; Wersja 3 tego nie zmieni. Uważam , że klauzula patentowa GPL v3 byłaby wystarczająca, aby powstrzymać Apple przed dotknięciem kodu GPL v3.
jamesdlin
Dlaczego miałby to być problem dla Apple? Bash jest już open source (wszystkie wersje ≥1,14 są dostępne za pośrednictwem GNU @ ftp.gnu.org/gnu/bash, a wersja dołączona do macOS (obecnie v3.2) jest dostępna za pośrednictwem Apple @ opensource.apple.com/source/bash ), ale można go modyfikować niezależnie.
głosy
@ tjt263 Chodzi o różnice między GPLv3 i GPLv2, których wersja, której używa Apple, jest nadal licencjonowana.
William T Froggard,
3
Racja, Bash3.2 jest licencjonowany na licencji GPLv2. Bash4.x jest licencjonowany na licencji GPLv3. Więc co? Powiedziałeś: „Apple nie zaktualizuje Bash, ponieważ najnowsza wersja jest na licencji GPLv3, z której Apple nie może korzystać ”. Dlaczego nie mogą? „Wymagałoby to, aby w przeciwnym razie oprogramowanie z zamkniętym kodem źródłowym zostało zmodyfikowane przez użytkowników , co oczywiście stanowiłoby problem dla Apple ”. Dlaczego to jest problem? Oni już to robią. Jest już modyfikowany przez społeczeństwo. Całe oprogramowanie jest. Zwłaszcza, gdy jest FOSS i rozdają kod źródłowy na swojej stronie każdemu, kto tego chce.
głosy
62

Czy rzeczywiście można zaktualizować bash do wersji 4.0 w OSX Yosemite? Tak.

  1. Pobierz / zainstaluj homebrew http://brew.sh/ , uruchamiając to polecenie w terminalu.

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  2. Zamknij i ponownie otwórz terminal. następnie wpisz

    brew install bash
  3. Zmień domyślną powłokę za pomocą terminala GUI z dosłowną ścieżką twojego nowego basha (EDYCJA: Muszę jeszcze znaleźć sposób CLI, który działa)

wprowadź opis zdjęcia tutaj

Czy rzeczywiście można zaktualizować bash do dostarczonej przez Apple wersji bash 4.0 w OSX Yosemite?

EDYCJA: Nie. Nie tak, jak prosi operacja. Np. Uaktualnij bieżącą instalację, zastępując się. W innych odpowiedziach zauważono, że Apple nie zaktualizowało basha z powodu problemów licencyjnych. Jednak pobranie zaktualizowanej i oddzielnej wersji basha i używanie jej jako domyślnej powłoki jest kanonicznym rozwiązaniem dla większości tłumaczy. Weźmy na przykład pytona. Nie uaktualniasz wersji 2.7 do 3.5, pobierasz osobną wersję i zmieniasz domyślną.

użytkownik136952
źródło
12
Można ustawić domyślne poprzez CLI z: sudo chpass -s /usr/local/bin/bash. Uwaga: najlepiej wskazać dowiązanie symboliczne w /usr/local/bin/ten sposób, że Brew może obsługiwać aktualizacje bez konieczności zmiany środowiska za każdym razem.
sansSpoon,
3
jakie ryzyko wiąże się z używaniem powłoki innej niż Apple?
Fan Bjorks numer jeden
5
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'następnie chsh -s /usr/local/bin/bashustawi domyślną powłokę dla terminala
Abhijit Sarkar
51

Jak powiedział @William w swojej odpowiedzi, Apple nie zapewnia bash 4 z powodu ograniczeń GPL. Możesz jednak zainstalować bash 4+, a także ustawić go jako domyślną powłokę (w tym dla terminala i iTerm2 ), wykonując następujące czynności.

Zainstaluj Bash 4 przez Homebrew

Najpierw zainstaluj nowszą wersję bash. Są na to różne sposoby, wolę Homebrew.

  • Zainstaluj Homebrew zgodnie z opisem na http://brew.sh .
  • Zainstaluj bash za pomocą brew install bash.

Bash 4 jest teraz dostępny na twojej ŚCIEŻCE (zakładając, że bin Homebrew jest na twojej ścieżce). Jednak nie jest to jeszcze twoja domyślna powłoka. Możesz dowiedzieć się, gdzie się znajduje, uruchamiając which bash. W moim przypadku jest to /usr/local/bin/bash.

Korzystanie z Bash 4

Ponieważ jest na twojej ŚCIEŻCE, możesz rozpocząć sesję Bash 4 za pomocą just bashlub można jej użyć w skryptach za pomocą Shebang .

Na przykład użyje określonej instancji bash.

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

Spowoduje to użycie pierwszego uderzenia na ścieżce.

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

Możesz także ustawić ścieżkę bash dla określonych profili w Terminalu / iTerm2, wykonując kroki opisane w odpowiedzi @ user136952.

Ustaw Bash 4 jako domyślny

Jak wspomniano powyżej, po zainstalowaniu Bash 4 nadal nie jest domyślną powłoką. Aby ustawić bash jako domyślny, musisz wykonać jeszcze dwa kroki.

Najpierw dodaj ścieżkę Bash 4 do swojego /etc/shellspliku, aby była to dozwolona powłoka logowania. Jak opisano w / etc / shells , ten plik ma listę poprawnych powłok logowania. Po dodaniu nowej ścieżki bash /etc/shellswygląda to tak:

# 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

Następnie używamy chsh, aby ustawić go jako domyślną powłokę. Tak więc wszelkie sesje dla tego użytkownika będą korzystać z tej powłoki. Możesz przeczytać więcej na ten temat w sekcji Zmień powłokę w terminalu Mac OS X , ale rzeczywiste polecenie jest bardzo proste.

chsh -s /usr/local/bin/bash

Teraz nowy bash jest naszą domyślną powłoką logowania. Jeśli otworzysz Terminal lub iTerm2 i uruchomisz bash --version, powinieneś zobaczyć nową wersję. Zwróć uwagę na „Licencję GPLv3 +”, dlatego Apple nie dołącza jej do systemu 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
źródło
2
Na podstawie artykułu / wątku, z którym się łączy, myślę, że naprawdę miał na myśli „nie domyślnie”, mówiąc „nie obok siebie”. Moja odpowiedź powoduje, że 4 jest domyślne, więc 3 nie jest już widoczne. Fakt, że stare bash wciąż zajmuje miejsce na dysku, nie wydaje mi się dużym problemem.
studgeek
1
+1 przeze mnie. Tak, OP tego nie chce, ale pytanie należy do społeczności, a jeśli to pomaga innym ludziom, to świetnie. Może nie otrzymać czeku po wybraniu odpowiedzi OP, ale nie oznacza to, że jest to zła odpowiedź.
bmike
3
W High Sierra sudo chpass -s /usr/local/bin/bashzmienia moją powłokę tylko na root / sudo . Aby zmienić dla mojego regularnego logowania, muszę uruchomić polecenie bez sudo. Może to być usługa Active Directory; Nie jestem pewny.
Bradd Szonye
1
Zamiast używać #!/usr/local/bin/bashshebang, spójrz na using #!/usr/bin/env bash( wyjaśnienie ). Spowoduje to uruchomienie skryptu z dowolną wersją bash dostępną dla środowiska, które uruchamia skrypt, tj. Cokolwiek which bashzwraca. To bardziej przenośne rozwiązanie korzystające z określonych ścieżek. Nie możemy oczekiwać, że inni użytkownicy zainstalują bash poprzez Homebrew.
Illya Moskvin
1
@IllyaMoskvin, pierwotnie użyłem określonej ścieżki, ponieważ chciałem wyraźnie pokazać, jak z niej korzystać. Zaktualizowałem przykłady, aby mieć oba.
studgeek
0

Możesz zainstalować inną wersję Bash bez homebrew

  • Idź do GNU Bash
  • Pobierz żądaną wersję ( tutaj )
  • I postępuj zgodnie z instrukcjami tutaj: https://gist.github.com/samnang/1759336

    Pobierz i zainstaluj wersję bash, którą chcesz Zamień XX (w bash-XX) na wersję, którą chcesz, np. 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
    

    Dodaj nową powłokę do listy legalnych powłok

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

    Zmień powłokę dla użytkownika

    chsh -s /usr/local/bin/bash

    Sprawdź Bash 4 i / usr / local / bin / bash ...

    echo $BASH && echo $BASH_VERSION

    Możesz chcieć dodać alias, jeśli chcesz, aby używało go polecenie bash. Umieść w swoim ~ / .bash_profile

    alias bash="/usr/local/bin/bash"
Raposo
źródło
-1

Instalacja równoległa z aktualizacją powłoki (przez chsh lub GUI) zakończy się niepowodzeniem dla skryptów. Często używane są skrypty env bash, które powracają do wersji bash OS X. Tak więc, czego chcesz, może nie być pełna aktualizacja bash, ale instalacja side-by-side, która zawsze zwraca nowszą wersję bash (tj. Nawet po envwywołaniu).

Aby sobie z tym poradzić:

1) zainstaluj bash przez Homebrew, tak jak napisali inni komentatorzy

2) ustaw powłokę logowania na tę nową wersję (za pomocą GUI lub komendy chsh, jak napisali inni)

3) ustaw /usr/local/bin(lub ścieżkę do nowej wersji bash) przed /binswoją zmienną $ PATH, dodając ją do ~/.bash_profile:export PATH=/usr/local/bin:$PATH

cwingrav
źródło
Spowoduje to uszkodzenie skryptów, które oczekują wersji bash 3 - tj.
Skryptów
Sprawiedliwy punkt. Działam tak od jakiegoś czasu i żadnych problemów. Być może Apple zapewnia pełną ścieżkę w swoich skryptach lub po prostu nie wpadł w kłopoty. W przypadku skryptów na poziomie systemu Apple, tj. Nie z poziomu powłoki, i tak nigdy nie wywołuje .bash_profile, więc i tak wpłynęłoby to tylko na działanie uruchamiane bezpośrednio w terminalu.
cwingrav
2
@ Mark Nie mogę myśleć o instancji, w której v ≥4.x zepsułby skrypt napisany dla v ≤3.x. Czy możesz?
głosy
-1

2019: Tak proste jak w tym poście

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

następnie wstaw nowy terminal, ciesz się!

Feuda
źródło
1
Kto w dół głosował na moją odpowiedź bez wyjaśnienia?
Feuda