Quais opções do shell bash são usadas pelo analisador?

Quais opções do shell bash são usadas pelo analisador?

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, extglobdeve 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 (quando extglobnã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 extglobe, portanto, não podem ser habilitadas em um comando de grupo que as utiliza?

Noshoptpágina do bashmanualnada 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 especial
  • expand_aliases- os aliases são expandidos bem no início do processamento
  • extquote- altera o significado de algumas citações
  • interactive_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, failglobe globstarafeta 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 extglobset 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 shoptcomando 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 -Oopção na linha de comando, por exemplo, em bash -O extglob -c 'echo !(foo)', o glob estendido funciona.

informação relacionada