J'ai trouvé que la définition de l' extglob
option shell dans un composé composé entraîne l'échec des anti-globes ultérieurs. Les options du shell doivent-elles être définies en dehors des commandes composées? Je n'ai vu aucune indication d'une telle exigence dans les pages de manuel de bash.
Par exemple, le script suivant fonctionne correctement (impressions a.0 a.1
):
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
shopt -s extglob
ls "a."!(b*)
Cependant, si les deux dernières lignes sont exécutées en tant que commande composée, le script échoue avec l'erreur suivante:
syntax error near unexpected token `('
` ls "a."!(b*)'
Cela a été testé en utilisant les versions bash de 4.2 à 4.4 et avec une variété de commandes composées :
(1) conditionnel - 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) bretelles - { }
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
{
shopt -s extglob
ls "a."!(b*)
}
(3) sous-coque - ( )
:
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
(
shopt -s extglob
ls "a."!(b*)
)
Dans tous les cas, si le shopt
est déplacé en dehors de la commande composée, le script réussit.
C
ouperl
sont capables de le faire correctement. Notez que ne pas faire partie d'une commande composée ne suffit pas,shopt -s extglob
doit également être sur une ligne distincte. Voir aussi la discussion et les exemples ici