shopt
afeta apenas o comportamento do shell no qual esse comando é executado. Se você colocá-lo em ~/.bashrc
, ele afetará os shells interativos e os comandos executados sobre rsh / ssh (os shells de login também podem será afetado se ~/.bashrc
for originado em ~/.profile
ou ~/.bash_profile
).
A configuração da variável de ambiente BASHOPTS
to extglob
afetará todos os shells bash interativos ou não interativos iniciados enquanto essa variável de ambiente estiver configurada (a menos que sejam chamados de sh
).
Shells interativos são onde você deseja ter extglob
set porque é onde você quer usá-lo, então ~/.bashrc
é um bom lugar para se beneficiar dele em todos os shell interativos. Se você quiser usá-lo em um script, basta adicioná-lo no início do script.
O único local onde isso poderia causar problemas é quando é definido enquanto algum código que você não escreveu não espera que seja configurado. Isso pode ser, por exemplo, scripts que você envia no prompt ou em ~/.bashrc
depois de definir a opção.
Embora isso seja verdade para algumas opções, não é para extglob
como foi cuidadosamente projetado (por David Korn como provém do ksh) para não quebrar a compatibilidade com o shell Bourne (e explica por que a sintaxe é tão estranho).
Basicamente, qualquer coisa usando globs estendidas seria um erro de sintaxe no shell Bourne ou na sintaxe do shell POSIX. Se um script Bourne ou POSIX tivesse echo @(a)
, ele seria quebrado (por causa do parêntese sem aspas). Não importa se, de repente, ele começou a produzir "a" em vez de uma mensagem de erro.
Por que o bash não o habilita por padrão não está claro para mim, dado que o bash não possui nenhuma outra sintaxe alternativa do glob globalizado como o zsh faz.
EDITAR . Embora David Korn tenha tentado não quebrar a compatibilidade Bourne / POSIX, parece que o bash não foi tão cuidadoso e é provavelmente por isso que ele não está ativado por padrão como no ksh.
Na emulação ksh (e zsh in ksh), os operadores de globbing estendido são desativados ao executar a globbing na substituição de parâmetros ou comandos:
$ touch a
$ a='@(a)' ksh93 -c 'echo $a'
@(a)
Enquanto no bash, não é o caso:
$ a='@(a)' BASHOPTS=extglob bash -c 'echo $a'
a