Sequências sem aspas (como *
, ???
, a?c
, abc
) são interpretadas por bash
como padrões de globbing e são expandidas para a lista de nomes de arquivos que correspondem ao padrão de globbing na corrente diretório de trabalho;
Dessa perspectiva, uma sequência não numerada que não contém curingas (como abc
) ainda é interpretada como um padrão de globbing que corresponde apenas a um nome de arquivo, como abc
;
Globbing básico executa, e. a expansão de *
para qualquer número de qualquer caractere e a expansão de ?
para um único caractere;
No entanto, negar um padrão de globbing é parte dos recursos de globbing estendido de bash
;
Assim, para expandir !(<globbing_pattern>)
, a globalização estendida deve estar ativada na atual bash
instance;
A globalização estendida é ativada por padrão quando bash
é chamado interativamente:
user@user-X550CL:~/tmp$ tree -a
.
|-- 1
|-- 2
|-- 3
'-- script.sh
0 directories, 4 files
user@user-X550CL:~/tmp$ shopt extglob
extglob on
user@user-X550CL:~/tmp$ rm !(script.sh)
user@user-X550CL:~/tmp$ tree -a
.
'-- script.sh
0 directories, 1 file
No entanto, o recurso de globbing estendido não é ativado por padrão quando bash
é chamado de não interativamente (por exemplo, quando chamado para executar um script):
user@user-X550CL ~/tmp % tree -a
.
|-- 1
|-- 2
|-- 3
'-- script.sh
0 directories, 4 files
user@user-X550CL ~/tmp % cat script.sh
#!/bin/bash
shopt extglob
rm ~/tmp/!(script.sh)
exit 0
user@user-X550CL ~/tmp % bash script.sh
extglob off
script.sh: line 3: syntax error near unexpected token '('
script.sh: line 3: 'rm ~/tmp/!(script.sh)'
user@user-X550CL ~/tmp % tree -a
.
|-- 1
|-- 2
|-- 3
'-- script.sh
0 directories, 4 files
Portanto, a solução é simplesmente ativar a globalização estendida no script usando o shopt
builtin: shopt -s extglob
;
user@user-X550CL ~/tmp % tree -a
.
|-- 1
|-- 2
|-- 3
'-- script.sh
0 directories, 4 files
user@user-X550CL ~/tmp % cat script.sh
#!/bin/bash
shopt -s extglob
shopt extglob
rm ~/tmp/!(script.sh)
exit 0
user@user-X550CL ~/tmp % bash script.sh
extglob on
user@user-X550CL ~/tmp % tree -a
.
'-- script.sh
0 directories, 1 file