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 dpkg
tratar 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, /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 consiga encontrar nenhuma menção a isso na página de manual, confirmei verificando a fonte. As linhas a seguir são da searchfiles
funçã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-query
que qualquer coisa que comece /
como um caminho absoluto e qualquer coisa que não o faça como um padrão a ser correspondido.