Cómo actualizar bash en Mac OS X Yosemite

25

Solo trato de aprender un poco las secuencias de comandos bash. Mi vieja versión bash:

Bash version 3.2.53(1)-release...

He actualizado mi bash en mac os x yosemite con homebrew:

brew update
brew install bash

Luego, en las propiedades del terminal, cambié la ruta estándar del shell de /bin/basha /usr/local/bin/bash(Según tengo entendido, aquí es donde el homebrew instala el bash actualizado).

Luego verifiqué el resultado nuevamente (y parece que todo está bien):

$ echo $BASH_VERSION
Bash version 4.0.33(0)-release...

Pero cuando estaba tratando de escribir un script bash simple:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {0..10..2}
  do
     echo "Welcome $i times"
 done

EL RESULTADO ES:

Bash version 3.2.53(1)-release...
Welcome {0..10..2} times

EN LUGAR DE:

Bash version 4.0.33(0)-release...
Welcome 0 times
Welcome 2 times
Welcome 4 times
Welcome 6 times
Welcome 8 times
Welcome 10 times

¿Por qué la versión de Bash vuelve a cambiar a la anterior cuando intento ejecutar el script en el mismo shell? ¡Esto me asusta! Por favor, alguien me explique cuál es mi problema)))

Dibujó
fuente

Respuestas:

17

Tu problema está en tu primera línea. Tu tienes esto:

#!/bin/bash

que establece explícitamente que el script de shell debe ejecutarse con el antiguo /bin/bash. Lo que realmente quieres es esto:

#!/usr/local/bin/bash

usar lo nuevo bashde /usr/local/bin.

BenjiWiebe
fuente
cosa rara, pero en realidad no funcionó. Sigue siendo el mismo resultado (((pero estoy seguro de que esto es parte de un problema
Drew
¿Necesito especificar esta ruta en otro lugar? ¿En algún archivo de shell o algo así?
Dibujó el
1
¿Quizás el entorno lo establece el shell de llamada, es decir, el viejo Bash? ¿Cómo llamas exactamente tu guión, @Andrew?
slhck
1
@ Andrew, sospecho que estás shdentro /bin. brewtal vez no hizo un enlace simbólico para bashllamado sh. Con su $PATHconjunto correctamente, intente iniciar de esta manera: bash script.sh.
BenjiWiebe
8
Para referencia futura, probablemente debería usar#!/usr/bin/env bash
pjvandehaar
15

Instalar nuevo bash:

brew install bash

Haga de este el shell predeterminado:

chsh -s /usr/local/bin/bash

Establecer el entorno en un script:

#!/usr/bin/env bash

El uso envbuscará Bash en tu $PATHy usará el primero que encuentre. Puede ver cuál bashusará escribiendo which bash. Si se está viendo /bin/bashen primer lugar, tendrá que configurar su $PATHen ~/.bashrcy /.bash_profile.

Ben
fuente
2
Si ve que se imprime "shell no estándar" al usarlo chsh, deberá actualizar / etc / shells .
Scott Willeke
6

Como pjv señaló, realmente deberías usar

#!/usr/bin/env bash

en tus scripts en todas partes para ser portátil. Por ejemplo, si intentas ejecutar tu script con

#!/usr/local/bin/bash

fallará en la mayoría de los sistemas Linux.

Agoston Horvath
fuente