Aktualisieren Sie Bash auf Version 4.0 unter OSX

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 Seite an Seite mit der alten. Gibt es eine Möglichkeit, die alte Bash-Shell direkt zu aktualisieren?

Das ist nicht nötig. Tatsächlich ist es immer eine gute Idee, das Original aufzubewahren. Zwei oder mehr Versionen von bash können gleichzeitig installiert werden, und Sie können festlegen, welche Version Sie als Standard verwenden möchten
Im Wesentlichen wäre das Software-Update von Apple dafür verantwortlich, die Version von BASH auf dem System zu ändern, wie es beim Update auf BASH für Shellshock der Fall war. Wenn Apple also 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. Ein indirekter Weg wäre, es auf die eine oder andere Weise selbst herunterzuladen und zu installieren und Legen Sie es dann als Ihre Standard-Shell fest. Ob Sie die ausgelieferte Version oder die aktualisierte Apple-Version entfernen, liegt ganz bei Ihnen.
Für alle anderen wie mich, die von Google hierher kommen, können Sie ab macOS Catalina (10.15) die Standard-Shell ziemlich einfach auf zsh setzen. zsh wird in Zukunft die Standard-Shell in macOS sein. Viele ähnliche Funktionen wie bash. Und vor allem ist es eine aktuelle Version. Schritte hier: support.apple.com/en-us/HT208050
In Yosemite (10.10) können Sie das wahrscheinlich, aber in El Capitan (10.11) verhindert der Systemintegritätsschutz support.apple.com/en-au/HT204899 , dass Sie /bin und damit /bin/bash ändern

Antworten (7)

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

Verweise:

Nach ein wenig Recherche scheint dies das Hauptproblem zu sein:

Wenn Personen Benutzerprodukte vertreiben, die Software unter GPLv3 enthalten, verlangt Abschnitt 6, dass sie Ihnen Informationen zur Verfügung stellen, die zum Ändern dieser Software erforderlich sind. Benutzerprodukte ist ein in der Lizenz speziell definierter Begriff; Beispiele für Benutzerprodukte sind tragbare Musikplayer, digitale Videorecorder und Heimsicherheitssysteme.

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

Kommentare sind nicht für längere Diskussionen gedacht; Diese Konversation wurde in den Chat verschoben .
Diese Erklärung ergibt keinen Sinn. Das Versenden einer GPL-Binärdatei (v3 oder anders) bedeutet nicht, dass der Rest des Betriebssystems veröffentlicht werden muss. Der Rest des Betriebssystems ist nicht mitbash . Die „Tivoization“-Klausel könnte erklären, warum bashbeispielsweise auf einem Apple TV nicht aktualisiert werden kann, aber nicht wirklich auf einem Desktop-Mac. Darüber hinaus müssten bereits "GPL-Teile" von der Öffentlichkeit modifizierbar gemacht werden; v3 würde daran nichts ändern. Ich würde glauben , dass die Patentklausel von GPL v3 ausreichen würde, um Apple davon abzuhalten, den GPL v3-Code anzufassen.
Warum sollte das ein Problem für Apple sein? Bash ist bereits Open Source (alle Versionen ≥1.14 sind über GNU @ ftp.gnu.org/gnu/bash verfügbar und die in macOS enthaltene Version (derzeit v3.2) ist über Apple @ opensource.apple.com/source/bash verfügbar ), aber es könnte trotzdem geändert werden.
@tjt263 Es geht um die Unterschiede zwischen GPLv3 und GPLv2, unter der die von Apple verwendete Version immer noch lizenziert ist.
Richtig, Bash3.2 ist unter GPLv2 lizenziert. Bash4.x ist unter GPLv3 lizenziert. Na und? Sie sagten: "Apple wird Bash nicht aktualisieren, da die neueste Version unter GPLv3 lizenziert ist, die Apple nicht verwenden kann ." Warum können sie nicht? "Dies würde erfordern, dass ansonsten Closed-Source-Software ihre GPL-geschützten Teile von der Öffentlichkeit modifizierbar gemacht werden , was offensichtlich ein Problem für Apple wäre ." Warum ist das ein Problem? Das tun 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 Seite an jeden weitergeben, der ihn haben möchte.
@jamesdlin Was genau ist die Patentklausel, die Apple von Bash 4 fernhält?
@FranklinYu Hm, ich erinnere mich nicht genau, was ich dachte, aber vielleicht "können Sie keinen Rechtsstreit (einschließlich einer Gegenklage oder Gegenklage in einem Gerichtsverfahren) einleiten, in dem Sie behaupten, dass ein Patentanspruch verletzt wird, indem Sie ihn machen, verwenden, verkaufen, anbieten zu verkaufen oder das Programm oder einen Teil davon zu importieren"
Dies ablehnen. OP fragt, ob Endbenutzer die installierte Bash-Version aktualisieren können, aber diese Antwort erklärt, warum Apple MacOS nicht mit der neuesten Version ausliefert. Diese Antwort befasst sich nicht mit der Frage von OP, bei der es sich um ein „Wie“ und nicht um ein „Warum“ handelt. (Obwohl, FWIW, diese Antwort die Frage nach dem „Warum“ genau beantwortet.)

Wie @William in seiner Antwort sagte, bietet Apple aufgrund von GPL-Einschränkungen kein bash 4 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 wie folgt vorgehen.

Installieren Sie Bash 4 über Homebrew

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

  • Installieren Sie Homebrew wie unter http://brew.sh beschrieben .
  • Bash installieren mit brew install bash.

Bash 4 ist jetzt auf Ihrem PATH verfügbar (vorausgesetzt, der Homebrew-Bin befindet sich auf Ihrem Pfad). 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 Bash4

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

Dies verwendet beispielsweise eine bestimmte Bash-Instanz.

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

Dies wird die erste Bash auf dem PATH verwenden.

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

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

Bash 4 zum Standard machen

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

Fügen Sie zuerst den Bash 4-Pfad zu Ihrer /etc/shellsDatei hinzu, damit es sich um eine zulässige Anmelde-Shell handelt. Wie in /etc/shells beschrieben , enthält diese Datei die Liste gültiger Login-Shells. Nach dem Hinzufügen des neuen Bash-Pfads /etc/shellssieht mein wie folgt 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. Daher verwenden alle Sitzungen für diesen Benutzer diese Shell. Sie können mehr darüber in Change the Shell in Mac OS X Terminal lesen , aber der eigentliche Befehl ist 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, sollten Sie die neue Version sehen. Beachten Sie die „Lizenz 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>
Er erwähnte, dass er ausdrücklich nicht die Installation-Side-by-Side-Option haben möchte.
Basierend auf dem Artikel / Thread, auf den er verlinkt hat, meinte er meiner Meinung nach wirklich "nicht standardmäßig", indem er nicht nebeneinander sagte. Meine Antwort macht 4 zum Standardwert, sodass 3 nicht mehr angezeigt wird. Die Tatsache, dass die alte Bash immer noch etwas Speicherplatz belegt, scheint mir kein großes Problem zu sein.
+1 von mir. Ja, OP will das nicht, aber die Frage gehört der Community und ob das anderen Leuten hilft, großartig. Es wird möglicherweise kein Häkchen als Antwort erhalten, die das OP auswählt, aber das macht es nicht zu einer schlechten Antwort.
@studgeek, gibt es langfristige Nebenwirkungen, wenn Sie bash4 zur Standard-Shell für den Root-Benutzer unter Mac OS X machen? Ich habe den chsh-Befehl ausgeführt, werde aber versuchen, mich daran zu erinnern, dass ich ihn zurücksetzen muss, wenn die Dinge drunter und drüber gehen. Es würde mir jedoch helfen, mich zu beruhigen, wenn ich die Antwort auf diese Frage wüsste. Danke schön!
Ändert in High Sierra sudo chpass -s /usr/local/bin/bashmeine Shell nur für root/sudo. Um zu meiner regulären Anmeldung zu wechseln, muss ich den Befehl ohne ausführen sudo. Dies könnte eine Sache von Active Directory sein; Ich bin mir nicht sicher.
Anstatt den #!/usr/local/bin/bashShebang zu verwenden, schauen Sie sich die Verwendung von #!/usr/bin/env bash( Erklärung ) an. Dadurch wird das Skript mit jeder Version von Bash ausgeführt, die von der Umgebung, die das Skript startet, erreichbar ist, dh was auch immer zurückgegeben wird which bash. Es ist eine tragbarere Lösung als die Verwendung bestimmter Pfade. Wir können nicht erwarten, dass andere Benutzer Bash über Homebrew installieren.
@BraddSzonye Ja, guter Fang. Ich hätte sudo nicht hineinstecken sollen. Ich habe es aktualisiert.
@IllyaMoskvin, ich habe ursprünglich einen bestimmten Pfad verwendet, weil ich zeigen wollte, wie man ihn explizit verwendet. Ich habe die Beispiele aktualisiert, um beides zu haben.
@harperville Ich hätte das sudo nicht vor dem chsh haben sollen. Wenn Sie es mit chsh ausführen, wird es nur für den aktuellen Benutzer geändert (was sicherer erscheint, wie Sie vorschlagen).
@studgeek Entschuldigung, mein Kommentar richtete sich an andere vorbeikommende Leser, aber danke, dass Sie die Antwort aktualisiert haben! Ich mag die envMethode, weil sie es einfacher macht, Skripte zwischen macOS und Linux wiederzuverwenden, zB zwischen Host und VMs.
chshwar der entscheidende fehlende Schritt für mich. Danke schön.
Bei Schritt 1 würde brew install bashder Befehl für die meisten Leute nach , which basheinfach auf die standardmäßig in macOS installierte Bash 3.4-Version verweisen, nicht auf die Version, die Sie gerade mit Homebrew installiert haben.
Einer der Hauptpunkte von Homebrew ist, dass es ausführbare Dateien in /usr/. Das Ausführen sudound Bearbeiten /etc/shellsscheint fehl am Platz zu sein, es wäre, als würden Sie /etc/pathsalle Ihre ausführbaren Dateien direkt bearbeiten, anstatt $PATHin Ihrer .bashrc.
Ich wasche, um meine Standard-Shell auf zsh zu belassen. Aber ich möchte neue Bash-Versionen für mein Bash-Skript verwenden. Ist es auf dem Mac möglich?
Eine schöne Schritt-für-Schritt-Anleitung von 2019 findet sich auch unter itnext.io/upgrading-bash-on-macos-7138bd1066ba

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 Ihr Terminal und öffnen Sie es erneut. dann tippen

    brew install bash
    
  3. Ändern Sie die Standard-Shell über die Terminal-GUI mit dem wörtlichen Pfad Ihrer neuen Bash (BEARBEITEN: Ich muss noch einen CLI-Weg finden, der funktioniert)

Geben Sie hier die Bildbeschreibung ein

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

EDIT: Nein. Nicht so, wie der Op fragt. Aktualisieren Sie beispielsweise die aktuelle Installation, indem Sie sich selbst ersetzen. In anderen Antworten wurde darauf hingewiesen, dass Apple bash aufgrund von Lizenzproblemen nicht aktualisiert hat. Das Herunterladen einer aktualisierten und separaten Version von bash und deren Verwendung als Standard-Shell ist jedoch für die meisten Interpreter die kanonische Lösung. Nehmen Sie zum Beispiel Python. Sie aktualisieren 2.7 nicht auf 3.5, sondern laden eine separate Version herunter und ändern Ihre Standardeinstellung.

Sie können die Voreinstellung über die CLI mit festlegen: sudo chpass -s /usr/local/bin/bash. Hinweis: Es ist am besten, auf den Symlink zu zeigen /usr/local/bin/, damit Brew Upgrades verarbeiten kann, ohne jedes Mal Ihre Umgebung ändern zu müssen.
Was sind die Risiken bei der Verwendung einer Nicht-Apple-Shell?
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
@3pitt Es besteht nur ein sehr geringes Risiko, ein neueres bashzu installieren, /usr/local/bin/bashda es das System in /bin/bashRuhe lässt. Daher bleiben alle Systemabhängigkeiten bash 3erhalten.

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

  • Gehen Sie 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, zB 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 Sie möchten, dass der Bash-Befehl ihn verwendet. Platzieren Sie es in Ihrem ~/.bash_profile

    alias bash="/usr/local/bin/bash"
    
Das scheint mir ein guter Ansatz zu sein, aber ich frage mich: Warum sollte man nicht einfach die Antike ersetzen/bin/bash ? Liegt es daran, dass es für die Kompatibilität mit anderer "antiker" Software benötigt wird, die Apple in MacOS vertreibt?
Dadurch werden alle Installationsverzeichnisse in /usr/local. Wenn Sie sie lieber in einem bash-X.XVerzeichnis organisiert haben möchten, hängen Sie /bash-X.Xsie an den Präfixparameter im ./configureBefehl an.
@Seamus Sie dürfen das /binVerzeichnis nicht ändern, es sei denn, Sie deaktivieren SIP.

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

Also, um damit umzugehen:

1) Bash über Homebrew installieren, wie die anderen Kommentatoren gepostet haben

2) Stellen Sie Ihre Login-Shell auf diese neue Version ein (über die GUI oder den Befehl chsh, wie andere gepostet haben)

3) Setzen Sie /usr/local/bin(oder den Pfad zur neuen Bash-Version) vor /binIhre $PATH-Variable, indem Sie dies zu Ihrem hinzufügen ~/.bash_profile:export PATH=/usr/local/bin:$PATH

Dadurch werden Skripte unterbrochen, die Bash Version 3 erwarten - dh von Apple bereitgestellte Skripte - Sie müssen sde by Side verwenden
Ein fairer Punkt. Läuft seit einiger Zeit so und ohne Probleme. Vielleicht stellt Apple den vollständigen Pfad in seinen Skripten bereit oder hat einfach keinen Haken gefunden. Für Skripte auf Apple-Systemebene, dh nicht von einer Shell, wird das .bash_profilesowieso nie aufgerufen, sodass es sich nur auf etwas auswirkt, das Sie sowieso direkt in einem Terminal ausführen.
@Mark Ich kann mir keinen Fall vorstellen, in dem v ≥4.x ein Skript beschädigen würde, das für v ≤3.x geschrieben wurde. Kanst du?

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ß!

Wer hat meine Antwort ohne Erklärung abgelehnt?
Es wurde wahrscheinlich herabgestuft, weil es ein Duplikat von apple.stackexchange.com/a/193413/333802 plus Kommentaren ist

Für M1-Macs -

Sie können bash aktualisieren, indem Sie Folgendes tun

brew install bash

vorausgesetzt, Sie haben bereits Homebrew. Dadurch wird die neueste Version von bash installiert. Sie können Ihre Installation überprüfen, indem Sie Folgendes ausführen:

brew info bash

Um die Shell zu aktualisieren, starten Sie einfach das Terminal neu und überprüfen Sie die Version von bash mit -

bash --version

Hoffe das hilft.

Unterscheidet sich dies von der Antwort für Intel-Macs? Außerdem sollte Schritt 1 "Homebrew installieren" sein.
Ich habe nicht an Intel-Macs gearbeitet, aber M1s haben eine ältere Version von Bash, also habe ich das hier eingefügt. Außerdem erwähnt meine Antwort "vorausgesetzt, Homebrew ist installiert".