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 qué diablos falla la tercera línea de arriba? Tenga en cuenta que la línea uno comienza con una barra diagonal ( /
), por lo que parece poco probable que ese sea el problema.
Respuesta1
Hasta donde yo sé, esto no está documentado, pero un líder /
hace que dpkg
trate el argumento como un camino y no un patrón. En otras palabras, si le dice que busque algo que comience con /
, asume que debe buscar un archivo en uno de los paquetes instalados con eseexactocamino.
Puedes confirmarlo fácilmente con
$ dpkg -S nonmatching
dpkg-query: no path found matching pattern *nonmatching*
$ dpkg -S /nonmatching
dpkg-query: no path found matching pattern /nonmatching
Tenga en cuenta que en el primer caso, con no /
, el error muestra que buscó *nomatching*
, mientras que con /
buscó la ruta exacta /nonmatching
. Por ejemplo, tampoco encuentra /doc
a pesar de la existencia de directorios como /usr/share/doc
:
$ dpkg -S /doc
dpkg-query: no path found matching pattern /doc
Si bien no puedo encontrar ninguna mención de esto en la página de manual, lo confirmé verificando la fuente. Las siguientes líneas son de la searchfiles
función definida en 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;
}
Eso agregará *
alrededor del argumento pasado a menos que ese argumento comience con un /
. Entonces, eso hace dpkg-query
que se trate todo lo que comience /
como una ruta absoluta y todo lo que no lo sea como un patrón que debe coincidir.