~ glob comportamento do operador com padrão vazio

4

De acordo com a documentação, ~ pode ser usado como glob operator quando EXTENDED_GLOB é definido, permitindo construções como

print -rl glob*~globA*~glob*B

para qualquer coisa que corresponda a glob* , mas não corresponda a globA* e glob*B .
Tudo bem:

touch file{1,2,3,4{,5}}
setopt extendedglob

agora

print -rl file*~f*3~file4* 

se comporta como esperado:

file1
file2

mas quando um padrão vazio é usado

print -rl file*~f*3~~file4*

imprime

file1
file2
file3

Parece que apenas o último padrão é usado para filtrar os resultados da 1ª glob (2ª e 3ª - que está vazia - são ignorados).

print -rl file*~f*3~file4*~~

produz

file1
file2
file4
file45

agora só o segundo é usado ...
O que é estranho é que, se o padrão após o primeiro til está vazio, não funciona, por exemplo,

print -rl file*~~f*3~file4*

erros com

zsh: no matches found: file*~~f*3~file4*

O que estou perdendo aqui?

isto é com zsh 5.3.1 se isso importa ...

    
por don_crissti 24.02.2017 / 21:30

1 resposta

5

~~ não usa um padrão vazio. Em vez disso, faz uma das duas coisas:

  • No final de todo o padrão, corresponde literalmente a " ~~ ".
  • No meio, corresponde literalmente a um único " ~ " e passa para o próximo padrão excluído (ou seja, um literal ~ seguido pelo operador ~ ).

Se estendermos seu conjunto de arquivos com alguns extras, poderemos ver isso acontecer:

touch file3~ file3~~ file4~ file4~~

Agora executando seu primeiro comando estranho:

print -rl file*~f*3~~file4*
file1
file2
file3
file3~~

file3~ foi excluído, assim como todos os três file4* s. file3~~ ainda está lá, porque não corresponde a f*3~ .

O segundo:

print -rl file*~f*3~file4*~~
file1
file2
file3~
file3~~
file4
file45
file4~

Apenas file4~~ foi excluído, porque esse é o único que corresponde a file4*~~ .

O último caso agora tem saída:

print -rl file*~~f*3~file4*
file3~
file3~~

pois esses são os dois arquivos correspondentes a file*~ que não correspondem a f*3 ou file4* .

Talvez isso possa ser um bug de análise, pelo menos para o caso literal do operador, mas não vejo um uso para um padrão de exclusão vazio, por isso não sei o que mais ele deve fazer.

    
por 24.02.2017 / 22:57

Tags