Eu descobri que definir a extglob
opção de shell em um composto composto resulta em falha dos anti-globs subsequentes. As opções de shell precisam ser definidas fora dos comandos compostos? Eu não vi uma indicação de tal requisito nas páginas de manual do bash.
Como exemplo, o seguinte script funciona bem (impressões a.0 a.1
):
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
shopt -s extglob
ls "a."!(b*)
No entanto, se as duas últimas linhas forem executadas como um comando composto, o script falhará com o seguinte erro:
syntax error near unexpected token `('
` ls "a."!(b*)'
Isso foi testado usando as versões bash de 4.2 a 4.4 e com uma variedade de comandos compostos :
(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) chaves - { }
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
{
shopt -s extglob
ls "a."!(b*)
}
(3) subcasca - ( )
:
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
(
shopt -s extglob
ls "a."!(b*)
)
Em todos os casos, se o shopt
comando for movido para fora do comando composto, o script será bem-sucedido.
C
ouperl
são capazes de fazê-lo bem. Observe que não fazer parte de um comando composto não é suficiente,shopt -s extglob
também precisa estar em uma linha separada. Veja também a discussão e os exemplos aqui