Ho scoperto che l'impostazione extglob
dell'opzione shell all'interno di un composto composto comporta un fallimento dei successivi anti-globs. Le opzioni della shell devono essere impostate al di fuori dei comandi composti? Non ho visto un'indicazione di tale requisito nelle pagine man di bash.
Ad esempio, il seguente script funziona bene (stampa a.0 a.1
):
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
shopt -s extglob
ls "a."!(b*)
Tuttavia, se le ultime due righe vengono eseguite come comando composto, lo script non riesce con il seguente errore:
syntax error near unexpected token `('
` ls "a."!(b*)'
Questo è stato testato usando le versioni bash da 4.2 a 4.4 e con una varietà di comandi composti :
(1) condizionale - 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) parentesi graffe - { }
#!/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*)
)
In tutti i casi, se shopt
viene spostato all'esterno del comando composto, lo script ha esito positivo.