Comportamento do dpkg -S quando o argumento começa com uma barra

2
dpkg -S /usr/share/doc/tasksel-data  # fine  
dpkg -S  usr/share/doc/tasksel-data  # fine  
dpkg -S     /share/doc/tasksel-data  # not found  
dpkg -S      share/doc/tasksel-data  # fine  
dpkg -S        are/doc/tasksel       # fine  

Por que na Terra a terceira linha acima falha? Note que a linha um começa com uma barra ( / ), de modo que parece improvável que seja o problema.

    
por Ray Andrews 11.10.2014 / 05:36

1 resposta

5

Isso não está documentado, até onde eu sei, mas um / líder faz com que dpkg trate o argumento como um caminho e não como um padrão. Em outras palavras, se você disser para procurar por algo que começa com / , ele pressupõe que ele deve procurar por um arquivo em um dos pacotes instalados com o caminho exato .

Você pode confirmar isso facilmente com

$ dpkg -S nonmatching
dpkg-query: no path found matching pattern *nonmatching*
$ dpkg -S /nonmatching
dpkg-query: no path found matching pattern /nonmatching

Observe que, no primeiro caso, sem / , o erro mostra que ele pesquisou *nomatching* , enquanto com / pesquisou o caminho exato /nonmatching . Por exemplo, ele também não consegue encontrar /doc apesar da existência de diretórios como /usr/share/doc :

$ dpkg -S /doc
dpkg-query: no path found matching pattern /doc

Embora não encontre nenhuma menção a isso na página do manual, confirmei confirmando a origem. As seguintes linhas são da função searchfiles definida em querycmd.c (dpkg 1.17.13)

 
if (!strchr("*[?/",*thisarg)) {
  varbuf_reset(&vb);
  varbuf_add_char(&vb, '*');
  varbuf_add_str(&vb, thisarg);
  varbuf_add_char(&vb, '*');
  varbuf_end_str(&vb);
  thisarg= vb.buf;
}   

Isso adicionará * em torno do argumento transmitido, a menos que esse argumento comece com / . Então, isso faz com que dpkg-query trate qualquer coisa que comece com / como um caminho absoluto e qualquer coisa que não seja como um padrão a ser correspondido.

    
por 11.10.2014 / 06:31

Tags