Ejecutar un script bash desde un shell zsh

11

Tengo problemas para ejecutar un script bash zsh. El script es similar al siguiente y se supone que se ejecuta bajo bash:

#!/bin/bash
echo "<235234>"  | egrep -oe [0-9]+

Sin embargo, mi shell está activado de manera predeterminada zsh, por lo que para ejecutar el script anterior, lo que hago es escribir /bin/bashen mi zshindicador y luego ejecuto . script.sh.

Sin embargo, esto da como resultado un error y obtengo:

zsh: no matches found: [0-9]+

(Debería obtener en su 235234lugar).

En este momento estoy confundido y tengo las siguientes preguntas:

  1. Si estoy dentro bash, ¿por qué recibo un error zsh?
  2. ¿Por qué egrepfalla la expresión regular? La expresión regular me parece correcta.

Nota: En caso de que sea importante, no se supone que modifique el script (el script es compartido por varios usuarios y no debemos realizar cambios en él).

Gracias

Amelio Vazquez-Reina
fuente

Respuestas:

19

Si el script comienza correctamente con #!/bin/bash(no puede tener otro comentario antes de eso), simplemente debe ejecutarlo escribiendo /path/to/script.sh, sin eso .al principio. El .es una instrucción de inclusión, que significa “ejecutar el contenido de este archivo como si hubiera sido escrito aquí en la línea de comandos” (esto se llama “compra de componentes” en la jerga Unix shell).

Ejecutar bash y obtener el script debería funcionar. Supongo que debido a que bash se inició automáticamente en algunas circunstancias, pero prefiere zsh, configuró bash para cambiar automáticamente a zsh, tal vez con exec zshsu ~/.bashrc. No haga eso: en su lugar, debe cambiar a zsh en el archivo que se ejecuta al iniciar sesión, es decir ~/.profile, y dejarlo .bashrcsolo. Para haber zshsido ejecutado en terminales, configure la SHELLvariable de entorno:

# in ~/.profile
export SHELL=/bin/zsh
if [ -t 1 ]; then exec $SHELL; fi

Es desafortunado que no pueda modificar el script, porque tiene errores. Los corchetes deben ser citados, incluso en bash. Si hay un archivo llamado 3+en el directorio actual, la llamada a egrepbuscará una o más ocurrencias del dígito en 3lugar de una secuencia de dígitos arbitrarios. Si hay un archivo llamado 3+y un archivo llamado 4+, la llamada a egrepbuscará 3s en el archivo 4+. Aquí, la diferencia entre bash y zsh solo entra en juego cuando ningún archivo coincide con el patrón proporcionado: bash ejecuta silenciosamente el comando con el patrón no sustituido, mientras que zsh señala un error (por defecto).

Gilles 'SO- deja de ser malvado'
fuente
Gracias @Guilles. Esto fue muy útil. Lo extraño es que no tengo exec zshen mi ~/.bashrc, ni en mi ~/.profile(ni siquiera tengo uno .profileen mi directorio de inicio). No recuerdo cómo logré hacer zshmi shell predeterminado. Además, perdón por la confusión, pero la primera línea de mi script es el shebang #!/bin/bash. Con esto, todavía no sé por qué el abastecimiento del archivo zshno funciona (si tiene alguna idea al respecto, hágamelo saber). En cualquier caso, me pondré en contacto con el administrador para actualizar el script, sin embargo, para agregar citas a la expresión regular.
Amelio Vazquez-Reina
El problema con el abastecimiento en zsh es el segundo argumento para egrep.
Ignacio Vazquez-Abrams