comando "bash" ejecuta scripts en la versión 3.2, no 4.4

2

Actualmente, en la terminal, mi shell interactivo predeterminado es la versión 4.4 de bash. El sistema operativo se envía con 3.2.

Si quiero ejecutar una secuencia de comandos (por ejemplo, my_script.sh ) con la versión 4.4 de bash, puedo obtenerla ( source my_script.sh ) o escribirla directamente en mi terminal. Sin embargo, en cada caso el script se ejecuta en mi shell actual. También puedo dar permisos de ejecución a un script y ejecutarlo como un comando, permitiendo que shebang controle qué versión de bash usar.

Sin embargo, el comando bash continúa usando la versión 3.2. Por ejemplo, si ejecuto bash my_script.sh , el script se ejecutará en un nuevo shell (lo que quiero), pero se usará la versión anterior de bash (3.2). De forma similar, si ejecuto bash sin argumentos, se abre un nuevo shell con la versión 3.2 (recordar, si abro una nueva ventana o pestaña en el terminal, usa mi shell predeterminado, bash v. 4.4. El problema aquí es ¿Qué sucede cuando uso el comando bash ?

Agregué la ruta de bash 4.4 en mi máquina ( /usr/local/bin/bash ) a mi variable PATH en .bash_profile , y no se está sobrescribiendo en otra parte ( echo $PATH da el resultado esperado: la primera la ruta es usr/local/bin/bash ). Esperaba que esto cambiara el comportamiento del comando bash

Puedo usar una solución alternativa, configurando un alias ( alias bash4='/usr/local/bin/bash' ), pero no tengo que usar un alias para bash 3.2, o para versiones mejoradas de, por ejemplo, python o R.

¿Hay algo que me falta? ¿Es la solución alias la única opción aquí?

EDITS

en respuesta a los comentarios:

SHELL es /usr/local/bin/bash , lo cual no es sorprendente, ya que es mi shell de inicio de sesión predeterminado.

type -a bash es interesante ...

bash is /bin/bash
bash is /usr/local/bin/bash
bash is /bin/bash
bash is /usr/local/bin/bash
bash is /bin/bash
bash is /usr/local/bin/bash
bash is /bin/bash
bash is /usr/local/bin/bash

Mi PATH completo es un desastre, que puede ser la fuente de este problema.

/usr/local/bin/bash:/Users/coltrane/Programming/Unix_Workbench/Code/Commands:/usr/local/bin/bash:/Users/coltrane/Programming/Unix_Workbench/Code/Commands:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin:/opt/X11/bin:/usr/local/git/bin:/Applications/anaconda/bin:/Library/Frameworks/Python.framework/Versions/3.5/bin:/Users/coltrane/Programming/Unix_Workbench/Code/Commands:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin:/opt/X11/bin:/usr/local/git/bin:/Applications/anaconda/bin:/Users/coltrane/Programming/Android_Development/sdk/platform-tools:/Library/Frameworks/R.framework/Resources/bin:/usr/local/git/bin:/Applications/anaconda/bin:/Library/Frameworks/Python.framework/Versions/3.5/bin:/Users/coltrane/Programming/Unix_Workbench/Code/Commands:/usr/local/bin/bash:/Users/coltrane/Programming/Unix_Workbench/Code/Commands:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin:/opt/X11/bin:/usr/local/git/bin:/Applications/anaconda/bin:/Library/Frameworks/Python.framework/Versions/3.5/bin:/Users/coltrane/Programming/Unix_Workbench/Code/Commands:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin:/opt/X11/bin:/usr/local/git/bin:/Applications/anaconda/bin:/Users/coltrane/Programming/Android_Development/sdk/platform-tools:/Library/Frameworks/R.framework/Resources/bin:/usr/local/git/bin:/Applications/anaconda/bin:/Users/coltrane/Programming/Android_Development/sdk/platform-tools:/Library/Frameworks/R.framework/Resources/bin

problema no relacionado con mi ruta, repetí inadvertidamente $PATH en una línea de mi .bash_profile , (PATH = $ PATH :: $ PATH) causando duplicación no deseada

    
pregunta De Novo 16.11.2018 - 21:00

3 respuestas

3

El error aquí es que la primera ruta en PATH fue al ejecutable de bash, en lugar de al directorio que contiene el ejecutable de bash. Para lectores con problemas similares: verifique dos veces para asegurarse de que cualquier ruta que agregue a su variable PATH se resuelva en un directorio, no en un archivo.

Problema:

He añadido lo siguiente a mi .bash_profile :

PATH=/usr/local/bin/bash:$PATH

/usr/local/bin/bash no es un directorio. Es un archivo (bueno, un enlace simbólico a un archivo). Entonces, independientemente de colocarlo al comienzo de PATH , el comando bash no encontrará un archivo ejecutable llamado bash dentro de ningún directorio en PATH hasta que llegue a /bin .

Solución:

En .bash_profile , configurando

PATH=/usr/local/bin:$PATH

Resuelve el problema. Ahora el comando bash encuentra el ejecutable dentro de /usr/local/bin antes de llegar a /bin .

    
respondido por el De Novo 16.11.2018 - 21:50
1

Si desea usar bash 4.4 como su shell predeterminado, haga lo siguiente:

  1. renombra el archivo /bin/bash a otra cosa ( bash3 por ejemplo)

    sudo mv /bin/bash /bin/bash3
    
  2. crea un enlace simbólico desde tu /usr/local/bin/bash a /bin/bash

    sudo ln -s /usr/local/bin/bash /bin/bash
    

Ahora, cada vez que abra un shell, abrirá la versión 4.x de bash y si alguna vez necesita ejecutar bash v3.x, simplemente invoque bash3 .

    
respondido por el Allan 16.11.2018 - 21:33
0

¿Por qué no instruir explícitamente al script para que realice su oferta exacta?

No empieces con

#!/bin/sh 

o lo que sea tu shebang.

Pero intente como la primera línea de su script de bash

#!/usr/local/bin/bash 

Si los problemas se originan al intentar ejecutarse

  

Al ejecutar un script de bash con el comando bash my_script.sh, shebang se trata como un comentario. El shebang solo se interpreta si le doy a my_script.sh permisos de ejecución y lo ejecuto como un comando.

Entonces es posible forzar tu voluntad sin un entorno PATH limpio (aunque todavía se recomienda limpiar eso) usando rutas absolutas:

Al ejecutar un script de bash con el comando /usr/local/bin/bash my_script.sh

Pero para esos casos, un alias para la ruta completa bash podría ser útil ...

    
respondido por el LangLangC 16.11.2018 - 22:39

Lea otras preguntas en las etiquetas