Restringindo nosso foco exclusivamente para bash
, emesta respostano Stack Overflow é relatado o seguinte.
extglob
é uma bandeira usadapelo analisador. Funções, comandos compostos, etc. são analisados na íntegra antes da execução. Portanto,extglob
deve ser definido antes que o conteúdo seja analisado; defini-lo no tempo de execução, mas após o tempo de análise, não tem nenhum efeito para o conteúdo analisado anteriormente.É também por isso que você não pode executar
shopt -s extglob; ls !(*.txt)
como uma linha (quandoextglob
não está definido anteriormente), mas deve ter uma nova linha entre os dois comandos.
No entanto, isso não é verdade para outras opções de shell. Considere, por exemplo, o seguinte.
$ ls -a
. .. .hiddenFile file1 file2 file3
$ shopt dotglob
dotglob off
$ echo *
file1 file2 file3
$ shopt -s dotglob; echo *
.hiddenFile file1 file2 file3
Está documentado em algum lugar quais opções de shell são usadas pelo analisador extglob
e, portanto, não podem ser habilitadas em um comando de grupo que as utiliza?
Noshopt
página do bash
manualnada sobre o comportamento acima parece ser mencionado.
Responder1
Está documentado em algum lugar quais opções de shell são usadas pelo analisador como extglob e, portanto, não podem ser habilitadas em um comando de grupo que as utiliza?
É difícil provar uma negativa, mas duvido que exista uma lista abrangente.
Os que descobri que afetam a análise estão abaixo, pode haver outros:
extglob
-- altera o significado dos parênteses, que de outra forma seriam um caractere especialexpand_aliases
- os aliases são expandidos bem no início do processamentoextquote
- altera o significado de algumas citaçõesinteractive_comments
- altera o significado de#
no início da palavra.
Algumas das compat*
opções também podem ter efeitos semelhantes, mas deixarei testá-las para alguém mais interessado.
Por outro lado, algo como dotglob
, failglob
e globstar
afeta apenas o resultado de um glob, não como ele é analisado.
Em relação a extglob
, uma linha de comando como !(foo)
é válida com extglob
set ou sem ele. Com ele, é um glob que corresponde a todos os arquivos foo
, exceto , e sem ele, é um subshell executando o comando foo
, com o valor de retorno invertido.
Observe que, na prática, isso não deve ser um problema. Em um script, você pode colocar o shopt
comando em uma linha própria, para que a alteração na análise afete a próxima linha sem problemas. Em uma linha, você pode usar a -O
opção na linha de comando, por exemplo, em bash -O extglob -c 'echo !(foo)'
, o glob estendido funciona.