Actualice bash a la versión 4.0 en OSX

81

¿Es posible actualizar bash a la versión 4.0 en OSX Yosemite?

echo $BASH_VERSION
3.2.57(1)-release

Este artículo y este hilo se refieren a la misma pregunta, pero instalan un nuevo shell junto con el anterior. ¿Hay alguna manera de actualizar directamente el viejo shell bash?

sluijs
fuente
3
No hay necesidad de hacer eso. De hecho, siempre es una buena idea conservar el original. Se pueden instalar dos o más versiones de bash al mismo tiempo, y puede configurar la que
prefiera
Esencialmente, la Actualización de software de Apple sería responsable de cambiar la versión de BASH en el sistema, como lo hizo con la actualización de BASH para Shellshock. Entonces, a menos que Apple proporcione una actualización, entonces no hay una forma directa de actualizar a la última versión de GNU BASH que vino instalada como parte de OS X. Una forma indirecta sería descargarla usted mismo, de una manera u otra, e instalarla y luego configúrelo como su shell predeterminado. Ya sea que elija o no eliminar la versión enviada o la versión actualizada de Apple, eso depende de usted.
user3439894

Respuestas:

36

Apple no actualizará Bash, porque la última versión tiene licencia bajo GPLv3, que Apple no puede usar. Sin embargo, han actualizado la mayoría de sus otros proyectiles. ZSH por ejemplo está mayormente actualizado.

Referencias

Después de un poco de investigación, este parece ser el problema principal:

Cuando las personas distribuyen productos de usuario que incluyen software bajo GPLv3, la sección 6 requiere que le brinden la información necesaria para modificar ese software. Productos de usuario es un término especialmente definido en la licencia; Los ejemplos de productos de usuario incluyen reproductores de música portátiles, grabadoras de video digital y sistemas de seguridad para el hogar.

Esto requeriría que el software de código cerrado se modificara por el público, lo que obviamente sería un problema para Apple.

William T Froggard
fuente
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
bmike
55
Esta explicación no tiene sentido. El envío de un binario GPL (v3 o no) no significa que el resto del sistema operativo deba ser liberado. El resto del sistema operativo no está vinculado a bash. La cláusula de "Tivoización" podría explicar por qué bashno se puede actualizar, por ejemplo, en un Apple TV, pero no realmente en una Mac de escritorio. Además, las "porciones de GPL" ya tendrían que ser modificables por el público; v3 no cambiaría eso. Me gustaría creer que el patentes cláusula de GPL v3 sería suficiente para disuadir a Apple de código GPL v3 tocar.
jamesdlin
¿Por qué sería un problema para Apple? Bash ya es de código abierto (todas las versiones ≥1.14 están disponibles a través de GNU @ ftp.gnu.org/gnu/bash y la versión incluida con macOS (actualmente v3.2) está disponible a través de Apple @ opensource.apple.com/source/bash ), pero podría modificarse independientemente.
voces
@ tjt263 Se trata de las diferencias entre GPLv3 y GPLv2, que la versión que utiliza Apple, todavía tiene licencia.
William T Froggard
3
Correcto, Bash3.2 tiene licencia bajo GPLv2. Bash4.x tiene licencia bajo GPLv3. ¿Y qué? Usted dijo: "Apple no actualizará Bash, porque la última versión tiene licencia bajo GPLv3, que Apple no puede usar ". ¿Por qué no pueden ellos? "Esto requeriría que el software de código cerrado se modificara por el público , lo que obviamente sería un problema para Apple ". ¿Por qué es eso un problema? Ya lo hacen. Ya es modificable por el público. Todo el software es. Especialmente cuando es FOSS y están regalando el código fuente en su sitio a cualquiera que lo desee.
voces
62

¿Es posible actualizar bash a la versión 4.0 en OSX Yosemite? Si.

  1. Descargue / instale homebrew http://brew.sh/ ejecutando este comando en la terminal.

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  2. Salga y vuelva a abrir su terminal. luego escribe

    brew install bash
  3. Cambie el shell predeterminado a través de la interfaz gráfica de usuario del terminal con la ruta literal de su nuevo bash (EDITAR: todavía tengo que encontrar una forma CLI que funcione)

ingrese la descripción de la imagen aquí

¿Es posible actualizar bash a la versión 4.0 de bash proporcionada por Apple en OSX Yosemite?

EDITAR: No. No en la forma en que el operador está preguntando. Por ejemplo, actualice la instalación actual reemplazándose. Se ha observado en otras respuestas que Apple no ha actualizado bash debido a problemas de licencia. Sin embargo, descargar una versión actualizada y separada de bash y usarlo como su shell predeterminado es la solución canónica para la mayoría de los intérpretes. Tome python por ejemplo. No actualiza 2.7 a 3.5, descarga una versión separada y cambia su configuración predeterminada.

usuario136952
fuente
12
Puede establecer el valor predeterminado a través de la CLI: sudo chpass -s /usr/local/bin/bash. Nota: es mejor señalar el enlace simbólico de /usr/local/bin/esa manera Brew puede manejar las actualizaciones sin tener que cambiar su entorno cada vez.
sansSpoon
3
¿Cuáles son los riesgos de ir con un shell que no sea de Apple?
Fanático número uno de Bjorks el
55
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'luego chsh -s /usr/local/bin/bashestablecerá el shell predeterminado para la terminal
Abhijit Sarkar
52

Como @William dijo en su respuesta, Apple no proporciona bash 4 debido a restricciones de GPL. Sin embargo, puede instalar bash 4+ y también puede convertirlo en su shell predeterminado (incluso para Terminal e iTerm2 ) haciendo lo siguiente.

Instalar Bash 4 a través de Homebrew

Primero instale la versión más reciente de bash. Hay varias formas de hacerlo, prefiero Homebrew.

  • Instale Homebrew como se describe en http://brew.sh .
  • Instala bash usando brew install bash.

Bash 4 ahora está disponible en su RUTA (asumiendo que Homebrew bin está en su camino). Sin embargo, aún no es su shell predeterminado. Puede encontrar dónde se encuentra al ejecutar which bash. En mi caso es a las /usr/local/bin/bash.

Usando Bash 4

Como está en su RUTA, puede iniciar una sesión de Bash 4 con solo basho se puede usar en scripts utilizando un Shebang .

Por ejemplo, esto usará una instancia de bash específica.

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

Esto usará el primer golpe en la RUTA.

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

También puede establecer la ruta bash para perfiles específicos en Terminal / iTerm2 utilizando los pasos descritos en la respuesta de @ user136952.

Hacer que Bash 4 sea el predeterminado

Como se mencionó anteriormente, después de instalar Bash 4 todavía no es el shell predeterminado. Para que bash sea el valor predeterminado, debe realizar dos pasos más.

Primero, agregue la ruta Bash 4 a su /etc/shellsarchivo para que sea un shell de inicio de sesión permitido. Como se describe en / etc / shells , este archivo tiene la lista de shells de inicio de sesión válidos. Después de agregar la nueva ruta de bash, mi /etc/shellsaspecto es el siguiente:

# 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

A continuación, usamos chsh para convertirlo en su shell predeterminado. Entonces, cualquier sesión para ese usuario usará ese shell. Puede leer más sobre esto en Change the Shell en Mac OS X Terminal , pero el comando real es muy sencillo.

chsh -s /usr/local/bin/bash

Ahora el nuevo bash es nuestro shell de inicio de sesión predeterminado. Si abre Terminal o iTerm2 y ejecuta bash --version, debería ver la nueva versión. Tenga en cuenta la "Licencia GPLv3 +", por lo que Apple no la incluye 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>
studgeek
fuente
2
Basado en el artículo / hilo al que se vinculó, creo que realmente quiso decir "no predeterminado" al decir que no estaban lado a lado. Mi respuesta hace que 4 sea el valor predeterminado, por lo que 3 ya no se ve. El hecho de que el viejo bash todavía esté ocupando algo de espacio en disco no me parece un gran problema.
studgeek
1
+1 por mí Sí, OP no quiere esto, pero la pregunta pertenece a la comunidad y si esto ayuda a otras personas, increíble. Es posible que no obtenga una verificación como la respuesta que selecciona el OP, pero eso no lo convierte en una mala respuesta.
bmike
3
En High Sierra, sudo chpass -s /usr/local/bin/bashcambia mi shell solo para root / sudo . Para cambiar mi inicio de sesión habitual, debo ejecutar el comando sin sudo. Esto podría ser una cosa de Active Directory; No estoy seguro.
Bradd Szonye
1
En lugar de usar el #!/usr/local/bin/bashshebang, busca usar #!/usr/bin/env bash( explicación ). Esto ejecutará el script con cualquier versión de bash accesible por el entorno que está iniciando el script, es decir, lo que sea que which bashregrese. Es una solución más portátil que usar rutas específicas. No podemos esperar que otros usuarios instalen bash a través de homebrew.
Illya Moskvin
1
@IllyaMoskvin, originalmente usé una ruta específica porque quería mostrar cómo usarla explícitamente. He actualizado los ejemplos para tener ambos.
studgeek
0

Puedes instalar otra versión de Bash sin homebrew

  • Ir a GNU Bash
  • Descargue la versión que desee ( aquí )
  • Y siga los pasos aquí: https://gist.github.com/samnang/1759336

    Descargue e instale la versión de bash que desee Reemplace XX (en bash-XX) con la versión que desee, por ejemplo, 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
    

    Agregue el nuevo shell a la lista de shells legítimos

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

    Cambiar el shell para el usuario

    chsh -s /usr/local/bin/bash

    Verifique Bash 4 y / usr / local / bin / bash ...

    echo $BASH && echo $BASH_VERSION

    Es posible que desee agregar un alias si desea que el comando bash lo use. Colocar en su ~ / .bash_profile

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

La instalación en paralelo con una actualización de su shell (a través de chsh o la GUI) fallará para los scripts. Las secuencias de comandos suelen usarse env bash, lo que vuelve a la versión bash de OS X. Entonces, lo que desea puede no ser la actualización completa de bash, sino una instalación en paralelo que siempre devuelve la versión más reciente de bash (es decir, incluso cuando envse invoca).

Entonces, para manejar esto:

1) instale bash a través de Homebrew, como los otros comentaristas han publicado

2) configure su shell de inicio de sesión en esta nueva versión (a través de la GUI o el comando chsh como otros han publicado)

3) establezca /usr/local/bin(o la ruta a la nueva versión de bash) por delante de /binsu variable $ PATH, agregando esto a su ~/.bash_profile:export PATH=/usr/local/bin:$PATH

cwingrav
fuente
Esto romperá las secuencias de comandos que esperan la versión 3 de bash, es decir, las secuencias de comandos proporcionadas por Apple, debe usar sde al lado
user151019
Un punto justo. He estado funcionando así por algún tiempo y sin problemas. Tal vez Apple proporciona la ruta completa en sus scripts o simplemente no ha dado en el blanco. Para los scripts de nivel de sistema de Apple, es decir, no desde un shell, nunca llama al modo de .bash_profiletodos modos, por lo que solo afectaría algo que se ejecuta directamente en un terminal de todos modos.
cwingrav
2
@ Mark No puedo pensar en una instancia donde v ≥4.x rompería un script escrito para v ≤3.x. ¿Puedes?
voces
-1

2019: tan simple como en esta publicación

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

luego tabula una nueva terminal, ¡disfruta!

Feuda
fuente
1
¿Quién rechazó mi respuesta sin una explicación?
Feuda