Actualice bash a la versión 4.0 en OSX

¿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 antiguo shell bash?

No hay necesidad de hacer eso. De hecho, siempre es buena idea conservar el original. Se pueden instalar dos o más versiones de bash al mismo tiempo, y puede establecer la que desee como predeterminada
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, no hay una forma directa de actualizar a la última versión de GNU BASH que se instaló como parte de OS X. Una forma indirecta sería descargarlo usted mismo, por un medio u otro, instalarlo y luego configúrelo como su shell predeterminado. Ya sea que elija eliminar o no la versión enviada o la versión actualizada de Apple, eso depende de usted.
Para cualquier otra persona como yo que venga aquí desde Google, comenzando con macOS Catalina (10.15), puede configurar el shell predeterminado en zsh con bastante facilidad. zsh será el shell predeterminado en macOS en el futuro. Muchas características similares a bash. Y lo más importante es una versión actualizada. Pasos aquí: support.apple.com/en-us/HT208050
Probablemente en Yosemite (10.10) puedas, pero en El Capitan (10.11) System Integrity Protection support.apple.com/en-au/HT204899 evitará que modifiques /bin y, por lo tanto, /bin/bash

Respuestas (7)

Apple no actualizará Bash porque la última versión tiene licencia GPLv3, que Apple no puede usar. Sin embargo, han actualizado la mayoría de sus otros caparazones. 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 proporcionen la información necesaria para modificar ese software. Productos de usuario es un término especialmente definido en la licencia; 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, de lo contrario, el software de código cerrado tenga sus partes GPL modificadas por el público, lo que obviamente sería un problema para Apple.

Los comentarios no son para una discusión extensa; esta conversación se ha movido a chat .
Esta explicación no tiene sentido. El envío de un binario GPL (v3 o de otro tipo) no significa que el resto del sistema operativo deba ser lanzado. El resto del sistema operativo no se vincula a bash. La cláusula de "Tivoización" podría explicar por qué bashno se puede actualizar, digamos, en un Apple TV, pero no en una Mac de escritorio. Además, las "porciones bajo GPL" ya tendrían que ser modificables por el público; v3 no cambiaría eso. Creo que la cláusula de patentes de GPL v3 sería suficiente para disuadir a Apple de tocar el código GPL v3.
¿Por qué sería eso 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.
@ tjt263 Se trata de las diferencias entre GPLv3 y GPLv2, bajo las cuales la versión que usa Apple todavía tiene licencia.
Correcto, Bash3.2 tiene licencia GPLv2. Bash4.x tiene licencia GPLv3. ¿Así que lo que? Dijiste: "Apple no actualizará Bash, porque la última versión tiene licencia GPLv3, que Apple no puede usar ". ¿Por qué no pueden? "Esto requeriría que el software de código cerrado, de lo contrario, tenga sus partes GPL modificadas por el público , lo que obviamente sería un problema para Apple ". ¿Por qué es eso un problema? Eso ya lo hacen. Ya es modificable por el público. Todo el software lo es. Especialmente cuando se trata de software libre y están regalando el código fuente de su sitio a cualquiera que lo desee.
@jamesdlin ¿Cuál es exactamente la cláusula de patentes que mantiene a Apple alejada de Bash 4?
@FranklinYu Hm, no recuerdo exactamente lo que estaba pensando, pero tal vez "no puede iniciar un litigio (incluida una contrademanda o contrademanda en una demanda) alegando que se infringe cualquier reclamo de patente al hacer, usar, vender, ofrecer para la venta, o importar el Programa o cualquier parte del mismo"
Votando negativo esto. OP pregunta si los usuarios finales pueden actualizar la versión de bash que está instalada, pero esta respuesta explica por qué Apple no envía MacOS con la última versión. Esta respuesta no se relaciona con la pregunta de OP, que es un "cómo hacerlo", no un "por qué". (Aunque, FWIW, esta respuesta responde con precisión a la pregunta "por qué") .

Como dijo @William en su respuesta, Apple no proporciona bash 4 debido a las 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.

Instale Bash 4 a través de Homebrew

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

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

Bash 4 ahora está disponible en su RUTA (suponiendo que Homebrew bin esté en su ruta). Sin embargo, todavía no es su shell predeterminado. Puede encontrar dónde se encuentra ejecutando which bash. En mi caso está en /usr/local/bin/bash.

Uso de bash 4

Dado que está en su RUTA, puede iniciar una sesión de Bash 4 con solo basho puede usarse en scripts usando un Shebang .

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

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

Esto usará el primer bash en el PATH.

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

También puede configurar la ruta bash para perfiles específicos en Terminal/iTerm2 siguiendo 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 de 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 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 in 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+", razón por la cual 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>
Mencionó que específicamente no quiere la opción de instalación en paralelo.
Basado en el artículo / hilo al que se vinculó, creo que realmente quiso decir "no por defecto" al decir que no uno al lado del otro. Mi respuesta hace que 4 sea el valor predeterminado, por lo que 3 ya no se ve. El hecho de que el viejo bash aún esté ocupando algo de espacio en disco no me parece un gran problema.
+1 por mi. Sí, OP no quiere esto, pero la pregunta pertenece a la comunidad y si esto ayuda a otras personas, genial. Es posible que no obtenga una marca como la respuesta que selecciona el OP, pero eso no la convierte en una mala respuesta.
@studgeek, ¿hay algún efecto secundario a largo plazo al hacer que bash4 sea el shell predeterminado para el usuario root en Mac OS X? Ejecuté el comando chsh, pero voy a intentar recordar que si las cosas se tuercen, necesito volver a cambiarlo. Sin embargo, ayudaría a tranquilizarme sabiendo la respuesta a esta pregunta. ¡Gracias!
En High Sierra, sudo chpass -s /usr/local/bin/bashcambia mi shell solo para root/sudo . Para cambiar mi inicio de sesión normal, debo ejecutar el comando sin sudo. Esto podría ser algo de Active Directory; No estoy seguro.
En lugar de usar el #!/usr/local/bin/bashshebang, considere usar #!/usr/bin/env bash( explicación ). Esto ejecutará la secuencia de comandos con cualquier versión de bash que sea accesible para el entorno que está iniciando la secuencia de comandos, es decir, lo 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.
@BraddSzonye Sí, buena captura. No debería haber metido sudo allí. lo he actualizado
@IllyaMoskvin, originalmente usé una ruta específica porque quería mostrar cómo usarla explícitamente. He actualizado los ejemplos para tener ambos.
@harperville No debería haber tenido el sudo antes del chsh. Ejecutarlo con chsh solo lo cambia para el usuario actual (lo que parece más seguro como sugiere).
@studgeek Disculpas, mi comentario estaba dirigido a otros lectores que pasaban, ¡pero gracias por actualizar la respuesta! Me gusta el envmétodo porque facilita la reutilización de scripts entre macOS y Linux, por ejemplo, entre el host y las máquinas virtuales.
chshfue el paso crítico que faltaba para mí. Gracias.
En el paso 1, para la mayoría de las personas después brew install bashde , el comando which bashsimplemente apuntaría a la versión bash 3.4 instalada de forma predeterminada en macOS, no a la versión que acaba de instalar con homebrew.
Uno de los puntos principales de homebrew es que instala ejecutables en formato /usr/. Hacer sudoy editar /etc/shellsparece fuera de lugar, sería como editar /etc/pathsdirectamente para todos sus ejecutables en lugar de hacer eco $PATHen su archivo .bashrc.
Lavo para mantener mi shell predeterminado en zsh. Pero quiero usar nuevas versiones de bash para mi script de bash. ¿Es posible en Mac?
También se puede encontrar un buen tutorial paso a paso de 2019 en itnext.io/upgrading-bash-on-macos-7138bd1066ba

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

  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 de 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 pregunta el operador. Por ejemplo, actualice la instalación actual reemplazándose a sí misma. Se ha notado en otras respuestas que Apple no ha actualizado bash debido a problemas de licencia. Sin embargo, descargar una versión separada y actualizada de bash y usarla como shell predeterminado es la solución canónica para la mayoría de los intérpretes. Tome pitón por ejemplo. No actualiza 2.7 a 3.5, descarga una versión separada y cambia la predeterminada.

Puede configurar el valor predeterminado a través de la CLI con: 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.
¿Cuáles son los riesgos de ir con un shell que no sea de Apple?
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'luego chsh -s /usr/local/bin/bashestablecerá el shell predeterminado para la terminal
@ 3pitt Hay muy poco riesgo de instalar uno más nuevo porque deja el sistema bashsolo . Por lo tanto, se conservarán todas las dependencias del sistema . /usr/local/bin/bash/bin/bashbash 3

Puedes instalar otra versión de Bash sin homebrew

  • Ir a GNU Bash
  • Descarga la versión que quieras ( aquí )
  • Y sigue 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
    

    Busque 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. Coloque en su ~/.bash_profile

    alias bash="/usr/local/bin/bash"
    
Esto me parece un buen enfoque, pero me pregunto esto: ¿Por qué uno simplemente no reemplazaría la antigüedad /bin/bash? ¿Es porque es necesario para la compatibilidad con otro software "antiguo" que Apple distribuye en MacOS?
Esto volcará todos los directorios de instalación en /usr/local. Si prefiere tenerlos organizados en un bash-X.Xdirectorio, agregue /bash-X.Xel parámetro de prefijo en el ./configurecomando.
@Seamus, no puede modificar el /bindirectorio a menos que deshabilite SIP.

La instalación en paralelo con una actualización de su shell (a través de chsh o la GUI) fallará para los scripts. Los scripts suelen utilizar env bash, que vuelve a la versión bash de OS X. Por lo tanto, es posible que lo que desee no sea la actualización completa de bash, sino una instalación en paralelo que siempre devuelva la versión más nueva de bash (es decir, incluso cuando envse invoque).

Entonces, para manejar esto:

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

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) antes de /binsu variable $PATH, agregando esto a su ~/.bash_profile:export PATH=/usr/local/bin:$PATH

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
Un punto justo. Ha estado funcionando así durante algún tiempo y sin problemas. Tal vez Apple proporciona la ruta completa en sus scripts o simplemente no se ha topado con ningún problema. Para los scripts de nivel de sistema de Apple, es decir, no desde un shell, nunca llama de .bash_profiletodos modos, por lo que solo afectaría algo que ejecute directamente en una terminal de todos modos.
@Mark No puedo pensar en una instancia en la que v ≥4.x rompería un script escrito para v ≤3.x. ¿Puedes?

2019: Tan sencillo como en este post

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

luego tabula un nuevo terminal, ¡disfrútalo!

¿Quién rechazó mi respuesta sin una explicación?
Probablemente fue rechazado porque es un duplicado de este apple.stackexchange.com/a/193413/333802 más comentarios

Para Mac M1 -

Puedes actualizar bash haciendo

brew install bash

asumiendo que ya tienes Home-brew. Esto instalará la última versión de bash. Puede verificar su instalación ejecutando:

brew info bash

Para actualizar el shell, simplemente reinicie el terminal y verifique la versión de bash usando -

bash --version

Espero que esto ayude.

¿Es esto diferente de la respuesta para Intel Macs? Además, el paso 1 debería ser "instalar homebrew".
No he trabajado en Intel Mac, pero los M1 tienen una versión anterior de bash, así que pongo esto aquí. Además, mi respuesta menciona "suponiendo que homebrew esté instalado".