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

Comportamento do dpkg -S quando o argumento começa com uma barra
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 diabos a terceira linha acima falha? Observe que a linha um começa com uma barra ( /), então parece improvável que esse seja o problema.

Responder1

Até onde eu sei, isso não está documentado, mas um líder /faz dpkgtratar o argumento como um caminho e não um padrão. Em outras palavras, se você pedir para ele procurar por algo que comece com /, ele assumirá que deve procurar por um arquivo em um dos pacotes instalados com esseexatocaminho.

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, com no /, o erro mostra que pesquisou *nomatching*, enquanto com o /pesquisou o caminho exato /nonmatching. Por exemplo, também não consegue encontrar, /docapesar da existência de diretórios como /usr/share/doc:

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

Embora não consiga encontrar nenhuma menção a isso na página de manual, confirmei verificando a fonte. As linhas a seguir são da searchfilesfunção 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á *o argumento passado, a menos que esse argumento comece com a /. Então, isso faz com dpkg-queryque qualquer coisa que comece /como um caminho absoluto e qualquer coisa que não o faça como um padrão a ser correspondido.

informação relacionada