Aktualisieren Sie bash unter OSX auf Version 4.0

81

Ist es möglich, bash in OSX Yosemite tatsächlich auf Version 4.0 zu aktualisieren?

echo $BASH_VERSION
3.2.57(1)-release

Dieser Artikel und dieser Thread beziehen sich auf dieselbe Frage, aber sie installieren eine neue Shell neben der alten. Gibt es eine Möglichkeit, die alte Bash-Shell direkt zu aktualisieren?

Schleusen
quelle
3
Das ist nicht nötig. Tatsächlich ist es immer eine gute Idee, das Original beizubehalten. Zwei oder mehr Versionen von bash können gleichzeitig installiert werden, und Sie können festlegen, welche
Version
Im Wesentlichen ist das Software-Update von Apple dafür verantwortlich, die Version von BASH auf dem System zu ändern, wie dies beim Update auf BASH für Shellshock der Fall war. Wenn Apple kein Update bereitstellt, gibt es keine direkte Möglichkeit, auf die neueste Version von GNU BASH zu aktualisieren, die als Teil von OS X installiert wurde. Eine indirekte Möglichkeit wäre, das Update auf die eine oder andere Weise selbst herunterzuladen und zu installieren Dann legen Sie es als Ihre Standard-Shell. Es liegt an Ihnen, ob Sie die gelieferte Version oder die von Apple aktualisierte Version entfernen möchten oder nicht.
user3439894

Antworten:

36

Apple wird Bash nicht aktualisieren, da die neueste Version unter der GPLv3 lizenziert ist, die Apple nicht verwenden kann. Sie haben jedoch die meisten ihrer anderen Shells aktualisiert. ZSH zum Beispiel ist meistens auf dem neuesten Stand.

Verweise:

Nach einigem Nachforschen scheint dies das Hauptproblem zu sein:

Wenn Benutzer Produkte vertreiben, die Software unter GPLv3 enthalten, müssen Sie gemäß Abschnitt 6 die erforderlichen Informationen zum Ändern dieser Software bereitstellen. Benutzerprodukte ist ein Begriff, der speziell in der Lizenz definiert ist. Beispiele für Benutzerprodukte sind tragbare Musikplayer, digitale Videorecorder und Heimsicherheitssysteme.

Dies würde erfordern, dass ansonsten Closed-Source-Software ihre GPL-Anteile von der Öffentlichkeit modifizierbar macht, was offensichtlich ein Problem für Apple wäre.

William T Froggard
quelle
Kommentare sind nicht für längere Diskussionen gedacht. Diese Unterhaltung wurde in den Chat verschoben .
bmike
5
Diese Erklärung ergibt keinen Sinn. Das Versenden einer GPL-Binärdatei (Version 3 oder anders) bedeutet nicht, dass der Rest des Betriebssystems freigegeben werden muss. Der Rest des OS nicht verlinken auf bash. Die "Tivoization" -Klausel könnte erklären, warum ein Update bashbeispielsweise auf einem Apple TV nicht möglich ist, auf einem Desktop-Mac jedoch nicht. Darüber hinaus müssten bereits "GPL-Anteile" von der Öffentlichkeit modifizierbar gemacht werden. v3 würde das nicht ändern. Ich würde glauben, dass die Patentklausel von GPL v3 ausreichen würde, um Apple davon abzuhalten, GPL v3-Code zu berühren.
Jamesdlin
Warum wäre das ein Problem für Apple? Bash ist bereits Open Source (alle Versionen ≥ 1.14 sind über GNU @ ftp.gnu.org/gnu/bash erhältlich. Die in macOS enthaltene Version (derzeit v3.2) ist über Apple @ opensource.apple.com/source/bash erhältlich ), kann aber trotzdem geändert werden.
Stimmen
@ tjt263 Es geht um die Unterschiede zwischen GPLv3 und GPLv2, unter denen die von Apple verwendete Version noch lizenziert ist.
William T Froggard
3
Richtig, Bash3.2 ist unter der GPLv2 lizenziert. Bash4.x ist unter der GPLv3 lizenziert. Na und? Sie sagten: "Apple wird Bash nicht aktualisieren, da die neueste Version unter der GPLv3 lizenziert ist, die Apple nicht verwenden kann ." Warum können sie nicht? "Dies würde erfordern, dass ansonsten Closed-Source-Software ihre GPL-Anteile von der Öffentlichkeit modifizierbar macht , was für Apple offensichtlich ein Problem wäre ." Warum ist das ein Problem? Das machen sie schon. Es kann bereits von der Öffentlichkeit geändert werden. Alle Software ist. Besonders wenn es FOSS ist und sie den Quellcode auf ihrer Site an jeden weitergeben, der es möchte.
Stimmen
62

Ist es möglich, bash in OSX Yosemite tatsächlich auf Version 4.0 zu aktualisieren? Ja.

  1. Laden Sie Homebrew http://brew.sh/ herunter / installieren Sie es, indem Sie diesen Befehl im Terminal ausführen.

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  2. Beenden Sie das Terminal und öffnen Sie es erneut. dann tippe

    brew install bash
  3. Ändern Sie die Standard-Shell über die Terminal-GUI mit dem Literal-Pfad Ihrer neuen Bash (BEARBEITEN: Ich habe noch keinen CLI-Weg gefunden, der funktioniert)

Bildbeschreibung hier eingeben

Ist es möglich, Bash in OSX Yosemite tatsächlich auf die von Apple bereitgestellte Bash- Version 4.0 zu aktualisieren ?

EDIT: Nein. Nicht in der Art, wie der Op fragt. Aktualisieren Sie z. B. die aktuelle Installation, indem Sie sie selbst ersetzen. In anderen Antworten wurde festgestellt, dass Apple Bash aufgrund von Lizenzproblemen nicht aktualisiert hat. Für die meisten Dolmetscher ist es jedoch die kanonische Lösung, eine aktualisierte und separate Version von bash herunterzuladen und als Standard-Shell zu verwenden. Nehmen wir zum Beispiel Python. Sie aktualisieren 2.7 nicht auf 3.5, sondern laden eine separate Version herunter und ändern Ihre Standardeinstellungen.

user136952
quelle
12
Sie können mit dem Standard über die CLI gesetzt: sudo chpass -s /usr/local/bin/bash. Hinweis: Es ist am besten, auf den Symlink zu verweisen, damit /usr/local/bin/Brew Upgrades durchführen kann, ohne die Umgebung jedes Mal ändern zu müssen.
SansSpoon
3
Was sind die Risiken einer Shell, die nicht von Apple stammt?
Bjorks Nummer eins Fan
5
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'Dann chsh -s /usr/local/bin/bashwird die Standard-Shell für das Terminal festgelegt
Abhijit Sarkar
51

Wie @William in seiner Antwort sagte, bietet Apple Bash 4 aufgrund von GPL-Einschränkungen nicht an. Sie können jedoch bash 4+ installieren und es auch zu Ihrer Standard-Shell machen (einschließlich für Terminal und iTerm2 ), indem Sie die folgenden Schritte ausführen .

Installieren Sie Bash 4 über Homebrew

Installieren Sie zuerst die neuere Version von bash. Dafür gibt es verschiedene Möglichkeiten, ich bevorzuge Homebrew.

Bash 4 ist jetzt in Ihrem PATH verfügbar (vorausgesetzt, der Homebrew-Bin ist auf Ihrem Weg). Es ist jedoch noch nicht Ihre Standard-Shell. Sie können herausfinden, wo es sich befindet, indem Sie ausführen which bash. In meinem Fall ist es bei /usr/local/bin/bash.

Verwenden von Bash 4

Da es sich auf Ihrem PATH befindet, können Sie eine Bash 4-Sitzung mit nur starten bashoder es kann in Skripten mit einem Shebang verwendet werden .

Dies wird beispielsweise eine bestimmte Bash-Instanz verwenden.

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

Dies wird die erste Bash auf dem Pfad verwenden.

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

Sie können den Bash-Pfad auch für bestimmte Profile in Terminal / iTerm2 festlegen, indem Sie die in der Antwort von @ user136952 beschriebenen Schritte ausführen.

Bash 4 als Standard festlegen

Wie oben erwähnt, ist Bash 4 nach der Installation immer noch nicht die Standard-Shell. Um Bash zur Standardeinstellung zu machen, müssen Sie zwei weitere Schritte ausführen.

Fügen Sie zunächst den Bash 4-Pfad zu Ihrer /etc/shellsDatei hinzu, sodass es sich um eine zulässige Anmeldeshell handelt. Wie in / etc / shells beschrieben , enthält diese Datei die Liste der gültigen Login-Shells. Nach dem Hinzufügen des neuen Bash-Pfads /etc/shellssieht es folgendermaßen aus:

# 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

Als nächstes verwenden wir chsh, um es zu Ihrer Standard-Shell zu machen. Alle Sitzungen für diesen Benutzer verwenden diese Shell. Weitere Informationen hierzu finden Sie unter Ändern der Shell in Mac OS X Terminal . Der eigentliche Befehl ist jedoch sehr einfach.

chsh -s /usr/local/bin/bash

Jetzt ist die neue Bash unsere Standard-Login-Shell. Wenn Sie Terminal oder iTerm2 öffnen und ausführen bash --version, sollte die neue Version angezeigt werden . Beachten Sie die "License GPLv3 +", weshalb Apple sie nicht mit macOS bündelt.

$ 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
quelle
2
Basierend auf dem Artikel / Thread, den er verlinkt hat, meinte er "nicht standardmäßig", indem er "nicht nebeneinander" sagte. Meine Antwort macht 4 zur Standardeinstellung, sodass 3 nicht mehr angezeigt wird. Die Tatsache, dass die alte Bash immer noch Speicherplatz in Anspruch nimmt, scheint mir kein großes Problem zu sein.
Studgeek
1
+1 von mir. Ja, OP will das nicht, aber die Frage gehört der Community und wenn das anderen Leuten hilft, super. Möglicherweise wird die Antwort, die das OP auswählt, nicht überprüft, dies macht sie jedoch nicht zu einer schlechten Antwort.
bmike
3
Ändert auf High Sierra sudo chpass -s /usr/local/bin/bashmeine Shell nur für root / sudo . Um meine reguläre Anmeldung zu ändern, muss ich den Befehl ohne ausführen sudo. Dies kann eine Active Directory-Sache sein. Ich bin mir nicht sicher.
Bradd Szonye
1
Anstatt den #!/usr/local/bin/bashShebang zu benutzen, schauen Sie in using #!/usr/bin/env bash( Erklärung ). Dadurch wird das Skript mit der Bash-Version ausgeführt, die von der Umgebung, die das Skript startet, erreichbar ist, dh mit der zurückgegebenen Version which bash. Diese Lösung ist portabler als die Verwendung bestimmter Pfade. Wir können nicht erwarten, dass andere Benutzer Bash über Homebrew installieren.
Illya Moskvin
1
@IllyaMoskvin, ich habe ursprünglich einen bestimmten Pfad verwendet, weil ich zeigen wollte, wie er explizit verwendet wird. Ich habe die Beispiele aktualisiert, um beides zu haben.
Studgeek
0

Sie können eine andere Version von Bash ohne Homebrew installieren

  • Gehe zu GNU Bash
  • Laden Sie die gewünschte Version herunter ( hier )
  • Und folgen Sie den Schritten hier: https://gist.github.com/samnang/1759336

    Laden Sie die gewünschte Bash-Version herunter und installieren Sie sie. Ersetzen Sie XX (in Bash-XX) durch die gewünschte Version, z. B. 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

    Fügen Sie die neue Shell zur Liste der legitimen Shells hinzu

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

    Ändern Sie die Shell für den Benutzer

    chsh -s /usr/local/bin/bash

    Suchen Sie nach Bash 4 und / usr / local / bin / bash ...

    echo $BASH && echo $BASH_VERSION

    Möglicherweise möchten Sie einen Alias ​​hinzufügen, wenn der bash-Befehl diesen verwenden soll. Platzieren Sie in Ihrem ~ / .bash_profile

    alias bash="/usr/local/bin/bash"
Raposo
quelle
-1

Die parallele Installation mit einem Update Ihrer Shell (über chsh oder die GUI) schlägt für Skripte fehl. Oft werden Skripte verwendet env bash, die auf die OS X-Bash-Version zurückgreifen. Was Sie also wollen, ist möglicherweise nicht das vollständige Update von bash, sondern eine Side-by-Side-Installation , die immer die neuere Version von bash zurückgibt (dh auch wenn sie envaufgerufen wird).

Also, um damit umzugehen:

1) installiere bash via Homebrew, wie die anderen Kommentatoren geschrieben haben

2) stelle deine Login-Shell auf diese neue Version ein (über die GUI oder den Befehl chsh, wie andere geschrieben haben)

3) Setze /usr/local/bin(oder den Pfad zur neuen Bash-Version) vor /bindeine $ PATH-Variable, indem du dies zu deinem hinzufügst ~/.bash_profile:export PATH=/usr/local/bin:$PATH

cwingrav
quelle
Dadurch werden Skripte
beschädigt
Ein fairer Punkt. Läuft schon seit einiger Zeit so und ohne Probleme. Vielleicht gibt Apple den vollständigen Pfad in seinen Skripten an oder es hat einfach keinen Haken getroffen. Bei Apple-Skripten auf Systemebene, dh nicht aus einer Shell, wird das .bash_profilesowieso nie aufgerufen, sodass es sich nur auf etwas auswirkt, das Sie direkt in einem Terminal ausführen.
Cwingrav
2
@Mark Ich kann mir keine Instanz vorstellen, in der v ≥4.x ein für v ≤3.x geschriebenes Skript beschädigt. Können Sie?
Stimmen
-1

2019: So einfach wie in diesem Beitrag

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

dann tab ein neues terminal, viel spaß!

Feuda
quelle
1
Wer hat meine Antwort ohne Erklärung abgelehnt?
Feuda