2 votos

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

Actualmente, en el terminal, mi shell interactiva predeterminada es bash versión 4.4. El sistema operativo viene con la versión 3.2.

Si quiero ejecutar un script (por ejemplo, my_script.sh) usando bash versión 4.4, puedo "sourcearlo" (source my_script.sh) o escribirlo directamente en mi terminal. Sin embargo, en ambos casos, el script se ejecuta en mi shell actual. También puedo darle permisos de ejecución a un script y ejecutarlo como un comando, permitiendo que el shebang controle qué versión de bash utilizar.

Sin embargo, el comando bash sigue utilizando la versión 3.2. Por ejemplo, si ejecuto bash my_script.sh, el script se ejecutará en una nueva shell (lo cual quiero), pero se utilizará la versión antigua de bash (3.2). De la misma manera, si simplemente ejecuto bash sin argumentos, se abrirá una nueva shell utilizando la versión 3.2 (recuerda, si abro una nueva ventana o pestaña en el terminal, utiliza mi shell predeterminada, bash v. 4.4. El problema aquí es lo que sucede cuando uso el comando bash).

He agregado la ruta a bash 4.4 en mi máquina (/usr/local/bin/bash) a mi variable PATH en .bash_profile, y no está siendo sobrescrita en otro lugar (echo $PATH da el resultado esperado: la primera ruta es usr/local/bin/bash). Esperaba que esto cambiara el comportamiento del comando bash

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

¿Hay algo que me esté perdiendo? ¿Es la solución del alias la única opción aquí?

EDICIONES

en respuesta a los comentarios:

SHELL es /usr/local/bin/bash, lo cual no es sorprendente, ya que es mi shell de inicio predeterminada.

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

Todo mi PATH es un desastre, lo cual 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:/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:/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 path, había repetido inadvertidamente $PATH en una línea de mi .bash_profile, (PATH=$PATH::$PATH) causando duplicación no deseada

0 votos

¡Bienvenido a Ask Different :) Por favor comparte la salida o ejecución type -a bash y echo $SHELL.

0 votos

Por favor, publica la salida de echo $PATH. El bash por defecto se encuentra en /bin/bash y apuesto a que está antes del camino hacia bash v.4.

0 votos

@Alan nope. El único uso de "bash" en $PATH es /usr/local/bin/bash, aunque se repite muchas veces... editando...

3voto

De Novo Puntos 141

El error aquí es que la primera ruta en PATH era al ejecutable de bash, en lugar de al directorio que contiene el ejecutable de bash. Para los lectores con problemas similares: asegúrese de verificar dos veces que cualquier ruta que agregue a su variable PATH se resuelva en un directorio, no en un archivo.

Problema:

Había agregado 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). Por lo tanto, independientemente de colocarlo al principio 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, configurar

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.

0voto

Douglas Puntos 10417

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

  1. renombrar el archivo /bin/bash a algo diferente (bash3 por ejemplo)

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

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

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

0 votos

Solo para aclarar, bash 4.4 ya es mi shell predeterminado. Cada vez que abro una terminal, ya se abre la versión 4.x de bash. Pero cuando estoy en mi shell predeterminado, si escribo bash, se abre una nueva terminal usando la versión 3.2 y bash my_script.sh ejecuta my_script.sh en una nueva terminal usando la versión 3.2.

0 votos

bash 4.4 es tu shell interactivo. Debido a tu ruta, cualquier subshell será 3.x. Esta solución asegura que estás utilizando primero 4.4.

0 votos

Gracias por la ayuda. Parece que tu solución funcionaría (+1), pero al final decidí arreglar mi ruta en lugar de agregar un enlace que podría confundirme más tarde. Tus comentarios en mi pregunta anterior me ayudaron a reconocer lo que debería haber visto desde el principio: /usr/local/bin/bash no es un directorio, por lo que es insignificante agregarlo a mi variable PATH. Y, por cierto, cualquier subshell era 4.4 anteriormente, solo usar el comando bash no funcionaba como se esperaba (debido a mi error de ruta).

0voto

Pickle Puntos 2099

¿Por qué no instruir al script explícitamente para que haga exactamente lo que deseas?

No lo inicies con

#!/bin/sh 

o cualquiera que sea tu shebang.

Pero intenta como primera línea de tu script bash

#!/usr/local/bin/bash 

Si el problema se origina al intentar ejecutar

Cuando se ejecuta un script bash con el comando bash my_script.sh, el 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 aún es posible imponer tu voluntad sin un entorno de PATH limpio (aunque sigue siendo recomendable limpiar eso) mediante el uso de rutas absolutas:

Cuando se ejecuta un script bash con el comando /usr/local/bin/bash my_script.sh

Pero para aquellos casos puede ser útil un alias al la ruta completa de bash...

0 votos

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

1 votos

LangLang, ese es un principio general acerca de cuándo se interpreta un shebang en lugar de ser tratado como un comentario, no es un problema que tenga :), pero sí, la ruta absoluta a la versión correcta funcionó antes de que arreglara la variable de la ruta (y el alias para hacerlo más conveniente)

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X