2 votos

¿Cómo puedo utilizar un glob con paréntesis en Zsh?

Esto:

cp ./hb_(lys|gln|thr|glu|ace|nhe)*_aacH*.ptraj ./

Funciona tal y como está previsto cuando se ejecuta en el terminal. Sin embargo, poniendo la misma línea en un ejecutable script no funciona ya que recibo un

syntax error near unexpected token `('\

Intenté escapar \ no resuelve el problema. Para bash parece que hay algo que hay que hacer con extglob aunque no encuentro ninguna sugerencia similar para zsh.

Se agradece cualquier ayuda.

4voto

Marlon Richert Puntos 251

Esto no tiene nada que ver con las opciones de la cáscara. Más bien, depende de lo que shebang que tiene en su archivo ejecutable.

Cuando se ejecuta un script como ejecutable (en lugar de source -o ejecutándolo como una función), se ejecuta en un sub-shell separado y no en su shell de nivel superior. Un sub-shell hereda el entorno de su padre (es decir, export ed), pero no las opciones del shell. En cambio, el shebang dicta en qué shell se ejecuta y con qué opciones.

Si el tinglado es #!/bin/zsh se iniciará un sub-shell de Zsh con las opciones por defecto, y luego leerá los comandos de /etc/zshenv y $ZDOTDIR/.zshenv , y luego desde su script.

Asimismo, si el tinglado es #!/bin/bash , su script se ejecutará realmente en Bash, y no en Zsh.

Por último, si el tinglado es #!/bin/sh depende de tu sistema operativo. En MacOS, hay un enlace simbólico /private/var/select/sh que apunta al ejecutable del shell a utilizar cuando el shebang es #!/bin/sh . (Tipo man 1 sh para más información). Por defecto, ese shell es Bash, y no Zsh, incluso si ha cambiado su shell de inicio de sesión a Zsh. La única manera de cambiarlo es cambiar ese enlace simbólico.

Pero incluso si usted hace /private/var/select/sh apunta al ejecutable de Zsh, si ejecuta su script con un #!/bin/sh shebang, Zsh no se ejecutará en "modo nativo". En su lugar, se ejecutará en sh modo de emulación, que alterna una serie de opciones que son significativamente diferente de los valores por defecto de Zsh .

Los paréntesis son sintaxis básica de glob en Zsh . Sin embargo, no están en Bash. Así que, mi suposición es que tu script se está ejecutando en Bash, por el shebang.


Así que, en fin, resumiendo: Ahórrate la molestia y no ejecutes tu script como un ejecutable. Más bien, lo que suele ser más conveniente en Zsh, es añadir el directorio padre de tu script a tu $fpath y luego autoload su script como una función .

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