He descubierto que configurar la extglob
opción de shell dentro de un compuesto compuesto da como resultado el fallo de los antiglobos posteriores. ¿Las opciones de shell deben establecerse fuera de los comandos compuestos? No vi una indicación de tal requisito en las páginas del manual de bash.
Como ejemplo, el siguiente script funciona bien (impresiones a.0 a.1
):
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
shopt -s extglob
ls "a."!(b*)
Sin embargo, si las dos últimas líneas se ejecutan como un comando compuesto, el script falla con el siguiente error:
syntax error near unexpected token `('
` ls "a."!(b*)'
Esto se probó utilizando versiones bash de 4.2 a 4.4 y con una variedad de comandos compuestos :
(1) condicional - if
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
if true; then
shopt -s extglob
ls "a."!(b*)
fi
(2) llaves - { }
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
{
shopt -s extglob
ls "a."!(b*)
}
(3) subshell - ( )
:
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
(
shopt -s extglob
ls "a."!(b*)
)
En todos los casos, si shopt
se mueve fuera del comando compuesto, el script tiene éxito.
C
operl
pueden hacerlo bien. Tenga en cuenta que no ser parte de un comando compuesto no es suficiente,shopt -s extglob
también tiene que estar en una línea separada. Vea también la discusión y ejemplos aquí