Comportamiento de dpkg -S cuando el argumento comienza con una barra diagonal

Comportamiento de dpkg -S cuando el argumento comienza con una barra diagonal
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 dpkgtrate 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 /doca 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 searchfilesfunció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-queryque se trate todo lo que comience /como una ruta absoluta y todo lo que no lo sea como un patrón que debe coincidir.

información relacionada