|
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
[Prev in Thread] | Current Thread | [Next in Thread] |