Aggiorna bash alla versione 4.0 su OSX


81

È possibile aggiornare bash alla versione 4.0 in OSX Yosemite?

echo $BASH_VERSION
3.2.57(1)-release

Questo articolo e questa discussione fanno riferimento alla stessa domanda, ma installano una nuova shell affiancata a quella precedente. C'è un modo per aggiornare direttamente la vecchia shell bash?


3
Non è necessario farlo. In effetti, è sempre una buona idea conservare quella originale. Due o più versioni di bash possono essere installate contemporaneamente e puoi impostare quella che preferisci come predefinita
lupincho,

In sostanza l'aggiornamento del software di Apple sarebbe responsabile della modifica della versione di BASH sul sistema, come ha fatto con l'aggiornamento a BASH per Shellshock. Quindi, a meno che Apple non fornisca un aggiornamento, non esiste un modo diretto per eseguire l'aggiornamento all'ultima versione di GNU BASH installata come parte di OS X. Un modo indiretto sarebbe scaricarlo da soli, in un modo o nell'altro, e installarlo e quindi impostalo come shell predefinita. Che tu scelga di rimuovere la versione fornita o la versione aggiornata di Apple, dipende da te.
user3439894,

Risposte:


36

Apple non aggiornerà Bash, poiché l'ultima versione è sotto licenza GPLv3, che Apple non può utilizzare. Hanno comunque aggiornato la maggior parte delle loro altre shell. ZSH per esempio è per lo più aggiornato.

Riferimenti:

Dopo un po 'di ricerca, questo sembra il problema principale:

Quando le persone distribuiscono prodotti utente che includono software in GPLv3, la sezione 6 richiede che forniscano le informazioni necessarie per modificare tale software. Prodotti dell'utente è un termine appositamente definito nella licenza; esempi di prodotti per l'utente includono lettori musicali portatili, videoregistratori digitali e sistemi di sicurezza domestica.

Ciò richiederebbe che i software altrimenti chiusi, se le loro parti GPL fossero rese modificabili dal pubblico, il che sarebbe ovviamente un problema per Apple.


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
bmike

5
Questa spiegazione non ha senso. Spedire un file binario GPL (v3 o altro) non significa che il resto del sistema operativo debba essere rilasciato. Il resto del sistema operativo non si collega a bash. La clausola "Tivoization" potrebbe spiegare perché bashnon può essere aggiornato, per esempio, su una Apple TV, ma in realtà non su un Mac desktop. Inoltre, le "porzioni di GPL" dovrebbero già essere rese modificabili dal pubblico; v3 non lo cambierebbe. Io crederei che l' brevetti clausola di GPL v3 sarebbe sufficiente a scoraggiare di Apple dal codice GPL v3 toccante.
jamesdlin,

Perché sarebbe un problema per Apple? Bash è già open source (tutte le versioni ≥1.14 sono disponibili tramite GNU @ ftp.gnu.org/gnu/bash e la versione inclusa con macOS (attualmente v3.2) è disponibile tramite Apple @ opensource.apple.com/source/bash ), ma potrebbe essere modificato a prescindere.
voci

@ tjt263 Riguarda le differenze tra GPLv3 e GPLv2, che la versione utilizzata da Apple, è ancora sotto licenza.
William T Froggard,

3
Bene, Bash3.2 è concesso in licenza in GPLv2. Bash4.x è concesso in licenza in GPLv3. E allora? Hai detto: "Apple non aggiornerà Bash, perché l'ultima versione è sotto licenza GPLv3, che Apple non può utilizzare ." Perché non possono? "Ciò richiederebbe che i software altrimenti chiusi, se le loro parti GPL fossero rese modificabili dal pubblico , il che sarebbe ovviamente un problema per Apple ." Perché è un problema? Lo fanno già. È già modificabile dal pubblico. Tutto il software è. Soprattutto quando è FOSS e stanno regalando il codice sorgente sul loro sito a chiunque lo desideri.
voci

62

È possibile aggiornare bash alla versione 4.0 in OSX Yosemite? Sì.

  1. Scarica / installa homebrew http://brew.sh/ eseguendo questo comando nel terminale.

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  2. Esci e riapri il tuo terminale. quindi digitare

    brew install bash
  3. Cambia la shell di default tramite l'interfaccia grafica del terminale con il percorso letterale della tua nuova bash (EDIT: devo ancora trovare un modo CLI che funzioni)

inserisci qui la descrizione dell'immagine

È possibile aggiornare bash alla versione 4.0 di bash fornita da Apple in OSX Yosemite?

EDIT: No. Non nel modo in cui l'operazione sta chiedendo. Ad esempio, aggiornare l'installazione corrente sostituendo se stessa. È stato notato in altre risposte che Apple non ha aggiornato bash a causa di problemi di licenza. Tuttavia, scaricare una versione aggiornata e separata di bash e usarla come shell predefinita è la soluzione canonica, per la maggior parte degli interpreti. Prendi ad esempio Python. Non si aggiorna da 2.7 a 3.5, si scarica una versione separata e si modifica l'impostazione predefinita.


12
È possibile impostare il valore predefinito tramite la CLI con: sudo chpass -s /usr/local/bin/bash. Nota: è meglio indicare il collegamento simbolico in /usr/local/bin/quel modo Brew può gestire gli aggiornamenti senza dover cambiare l'ambiente ogni volta.
sansSpoon

3
quali sono i rischi associati a una shell non Apple?
Fan numero uno di Bjorks il

5
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'quindi chsh -s /usr/local/bin/bashimposterà la shell predefinita per il terminale
Abhijit Sarkar,

52

Come ha detto @William nella sua risposta, Apple non fornisce bash 4 a causa delle restrizioni GPL. Tuttavia, puoi installare bash 4+ e renderlo la tua shell predefinita (anche per Terminal e iTerm2 ) procedendo come segue.

Installa Bash 4 tramite Homebrew

Innanzitutto installa la versione più recente di bash. Ci sono vari modi per farlo, preferisco l'homebrew.

  • Installa Homebrew come descritto su http://brew.sh .
  • Installa bash usando brew install bash.

Bash 4 è ora disponibile sul tuo PERCORSO (supponendo che il cestino Homebrew sia sul tuo percorso). Tuttavia, è non è ancora la shell di default. Puoi trovare dove si trova eseguendo which bash. Nel mio caso è a /usr/local/bin/bash.

Usare Bash 4

Dal momento che è sul tuo PERCORSO, puoi avviare una sessione di Bash 4 con just basho può essere usata negli script usando uno Shebang .

Ad esempio, questo utilizzerà un'istanza bash specifica.

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

Questo utilizzerà la prima bash sul PERCORSO.

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

Puoi anche impostare il percorso bash per profili specifici in Terminal / iTerm2 usando i passaggi descritti nella risposta di @ user136952.

Rendere Bash 4 predefinito

Come accennato in precedenza, dopo l'installazione di Bash 4 non è ancora la shell predefinita. Per rendere bash l'impostazione predefinita, è necessario eseguire altri due passaggi.

Innanzitutto, aggiungi il percorso di Bash 4 al tuo /etc/shellsfile in modo che sia una shell di accesso consentita. Come descritto in / etc / shells , questo file ha l'elenco di shell di login valide. Dopo aver aggiunto il nuovo percorso bash il mio /etc/shellsaspetto è il seguente:

# 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

Quindi usiamo chsh per renderlo la tua shell predefinita. Quindi qualsiasi sessione per quell'utente utilizzerà quella shell. Puoi leggere ulteriori informazioni al riguardo in Change the Shell nel Terminale di Mac OS X , ma il comando effettivo è molto semplice.

chsh -s /usr/local/bin/bash

Ora la nuova bash è la nostra shell di login predefinita. Se apri Terminal o iTerm2 ed esegui bash --versiondovresti vedere la nuova versione. Nota la "Licenza GPLv3 +", motivo per cui Apple non lo raggruppa con 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>

2
Sulla base dell'articolo / thread a cui ha collegato penso che intendesse davvero "non predefinito" dicendo non fianco a fianco. La mia risposta rende 4 l'impostazione predefinita, quindi 3 non viene più visualizzato. Il fatto che la vecchia bash occupi ancora spazio su disco non mi sembra un grosso problema.
Studgeek il

1
+1 da parte mia. Sì, OP non lo vuole, ma la domanda appartiene alla comunità e se questo aiuta altre persone, fantastico. Potrebbe non ottenere un controllo come la risposta selezionata dall'OP, ma ciò non lo rende una risposta negativa.
bmike

3
Su High Sierra, sudo chpass -s /usr/local/bin/bashcambia la mia shell solo per root / sudo . Per cambiare per il mio accesso normale, devo eseguire il comando senza sudo. Questa potrebbe essere una cosa di Active Directory; Non ne sono sicuro.
Bradd Szonye,

1
Invece di usare lo #!/usr/local/bin/bashshebang, cerca nell'uso #!/usr/bin/env bash( spiegazione ). Questo eseguirà lo script con qualunque versione di bash sia raggiungibile dall'ambiente che sta avviando lo script, cioè qualunque cosa which bashritorni. È una soluzione più portatile che utilizza percorsi specifici. Non possiamo aspettarci che altri utenti installino bash tramite homebrew.
Illya Moskvin,

1
@IllyaMoskvin, originariamente ho usato un percorso specifico perché volevo mostrare come usarlo esplicitamente. Ho aggiornato gli esempi per avere entrambi.
Studgeek

0

Puoi installare un'altra versione di Bash senza homebrew

  • Vai a GNU Bash
  • Scarica la versione desiderata ( qui )
  • E segui i passaggi qui: https://gist.github.com/samnang/1759336

    Scarica e installa la versione bash che desideri Sostituisci XX (in bash-XX) con la versione desiderata, ad es. 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
    

    Aggiungi la nuova shell all'elenco delle shell legittime

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

    Cambia la shell per l'utente

    chsh -s /usr/local/bin/bash

    Controlla Bash 4 e / usr / local / bin / bash ...

    echo $BASH && echo $BASH_VERSION

    Potresti voler aggiungere un alias se desideri che il comando bash lo utilizzi. Inserisci nel tuo ~ / .bash_profile

    alias bash="/usr/local/bin/bash"

-1

L'installazione side-by-side con un aggiornamento alla shell (tramite chsh o la GUI) non riuscirà per gli script. Gli script usano spesso env bash, che torna alla versione bash di OS X. Quindi, ciò che desideri potrebbe non essere l'aggiornamento completo di bash, ma un'installazione side-by-side che restituisce sempre la versione più recente di bash (cioè anche quando envviene invocato).

Quindi, per gestire questo:

1) installa bash tramite Homebrew, come hanno scritto gli altri commentatori

2) imposta la tua shell di login su questa nuova versione (tramite la GUI o il comando chsh come altri hanno pubblicato)

3) imposta /usr/local/bin(o il percorso della nuova versione bash) prima della /bintua variabile $ PATH, aggiungendo questo al tuo ~/.bash_profile:export PATH=/usr/local/bin:$PATH


Questo interromperà gli script che prevedono la versione 3 di bash - ovvero gli script forniti da Apple - devi usare sde by side
user151019

Un punto giusto. Funziono così da un po 'di tempo ormai e nessun problema. Forse Apple fornisce il percorso completo nei suoi script o semplicemente non ha colpito un intoppo. Per gli script a livello di sistema Apple, ovvero non da una shell, non chiama mai .bash_profilecomunque, quindi avrebbe un impatto solo su qualcosa che si esegue direttamente in un terminale.
Cwingrav,

2
@Mark Non riesco a pensare a un'istanza in cui v ≥4.x spezzerebbe uno script scritto per v ≤3.x. Puoi?
voci

-1

2019: semplice come in questo post

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

quindi tab un nuovo terminale, buon divertimento!


1
Chi ha votato in giù la mia risposta senza una spiegazione?
Feuda,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.