¿Cuáles son las restricciones de alcance para configurar shopt extglob? y otras opciones?

8

Mi shell bash no interactivo tiene extglob off. Me gustaría activarlo en la declaración inmediatamente antes de un comando, pero he notado que cuando shopt -s extglobestá dentro de un if .. then .. elsebloque, de alguna manera no se registra.

La siguiente extglob dependiente del comando no es válido: syntax error near unexpected token '('.

¿Dónde se extglobpuede establecer y por qué hay una restricción? ¿Esto se aplica a otras opciones? ... GNU bash 4.1.5

Esto funciona:

shopt -s extglob
if true ;then
    touch a.bcd; ls a.@(bcd)
fi

Esto falla:

if true ;then
    shopt -s extglob
    touch a.bcd; ls a.@(bcd)
fi
... line 17: syntax error near unexpected token `('
... line 17: `touch a.bcd; ls a.@(bcd)' 
Peter.O
fuente

Respuestas:

14

No estoy seguro de si hay una fuente más autorizada (es decir, página de manual / documentación oficial) sobre este tema, pero encontré un sitio que explica este comportamiento: http://mywiki.wooledge.org/glob

Debido a que la opción extglob cambia la forma en que se analizan ciertos caracteres, es necesario tener una nueva línea (no solo un punto y coma) entre el comando shopt y cualquier comando posterior que use globos extendidos. Del mismo modo, no puede poner shopt -s extglob dentro de un bloque de instrucciones que usa globos globales, porque el bloque en su conjunto debe analizarse cuando está definido; el comando shopt no entrará en vigencia hasta que se evalúe el bloque, momento en el cual es demasiado tarde. De hecho, como bash analiza todo el bloque de instrucciones antes de evaluarlo, debe establecer extglob fuera del bloque más externo.

lk-
fuente
1
Gracias. El enlace de wooledge lo cubre bastante bien. Supongo que tuvo que ser impedido de esa manera debido a algunos problemas heredados.
Peter.O
@ Peter.O Yo diría que es así porque el analizador de bash es inestable. Por supuesto, soy un usuario zsh con la boca sucia, excepto que parece recordar que esta es la razón oficial que figura en la lista de correo de bash. Bash tiene muchos problemas de análisis similares, como alias e=echo; e hellono funcionar: la definición de alias solo tiene lugar en la próxima línea nueva.
Gilles 'SO- deja de ser malvado'
Eso es interesante, gracias ... Un día, voy a pasar a mirar zsh. Parece tener todas las campanas y silbatos; muy compactos
Peter.O