shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[shell-script-pt] Comportamento inconsistente nas extglobs?


From: Blau Araujo
Subject: [shell-script-pt] Comportamento inconsistente nas extglobs?
Date: Tue, 3 Mar 2020 17:54:40 -0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.5.0

Salve, pessoal!


Uma perguntinha de quem gosta de olhar debaixo do capô do Bash:

Supondo que numa pasta eu tenho os arquivos:

a.txt  aa.txt  .txt

Considerando também que `extglob` está habilitado e `dotglob` está desabilitado, eu tenho as seguintes saídas:

---

# 1 - Casa apenas com zero ou um caractere 'a'...
:~$ ls ?(a).txt
a.txt  .txt

# 2 - Casa com zero ou mais caracteres 'a'...
:~$ ls *(a).txt
aa.txt  a.txt .txt

# 3 - Casa com tudo que não for apenas um 'a'...
:~$ ls !(a).txt
aa.txt

---

A questão é: por que o aquivo '.txt' foi expandido (para nossa surpresa) nos comandos 1 e 2 mas não foi expandido (como esperado) no comando 3?

A minha pergunta não tem nem tanto a ver com a implementação ou o funcionamento da sintaxe `!(lista-de-padrões)`, mas com a confirmação ou não de uma possível inconsistência do Bash. Quer dizer, as regras que valem para o '*' não valem para algumas sintaxes estendidas, menos uma delas?

Quer dizer, nós temos aparentemente duas regras para expansões que fazem basicamente a mesma coisa:

* Com `*` e `!(lista-de-padrões)`, o Bash não expande nomes de arquivos iniciados com ponto (`.`), a menos que a opção `dotglob` esteja habilitada.

* Com `?(lista-de-padrões)` e `*(lista-de-padrões)`, ele já expande nomes de arquivos iniciados com ponto (`.`), mesmo com `dotglob` desabilitado.

A minha suspeita é que, no caso do casamento negado, o Bash primeiro expande os nomes de arquivos como faria com um asterisco, caso em que arquivos com nomes iniciados com ponto não são expandidos, para só depois excluir os nomes que casem com o padrão.

Então, será que é isso?


Abraços!

-- 
Blau Araujo

reply via email to

[Prev in Thread] Current Thread [Next in Thread]