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
Warum um Himmels Willen schlägt die dritte Zeile oben fehl? Beachten Sie, dass Zeile eins mit einem Schrägstrich ( /
) beginnt, also ist das wahrscheinlich nicht das Problem.
Antwort1
Dies ist meines Wissens nicht dokumentiert, aber ein führendes /
Argument dpkg
behandelt das Argument als Pfad und nicht als Muster. Mit anderen Worten, wenn Sie es anweisen, nach etwas zu suchen, das mit beginnt /
, geht es davon aus, dass es nach einer Datei in einem der installierten Pakete mit diesem suchen sollte.genauWeg.
Sie können dies ganz einfach bestätigen mit
$ dpkg -S nonmatching
dpkg-query: no path found matching pattern *nonmatching*
$ dpkg -S /nonmatching
dpkg-query: no path found matching pattern /nonmatching
Beachten Sie, dass im ersten Fall, wenn kein angegeben wird /
, der Fehler anzeigt, dass nach gesucht wurde *nomatching*
, während mit nach /
dem genauen Pfad gesucht wurde /nonmatching
. Beispielsweise wird auch /doc
trotz der Existenz von Verzeichnissen wie nicht gefunden /usr/share/doc
:
$ dpkg -S /doc
dpkg-query: no path found matching pattern /doc
Obwohl ich in der Manpage keine Erwähnung davon finden kann, habe ich es durch Überprüfung der Quelle bestätigt. Die folgenden Zeilen stammen aus der searchfiles
in querycmd.c
(dpkg 1.17.13) definierten Funktion.
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;
}
Dadurch wird *
das übergebene Argument umschlossen, es sei denn, das Argument beginnt mit einem /
. Dies führt dazu, dass alles, was mit beginnt , als absoluter Pfad und alles, was nicht mit beginnt, als zu vergleichendes Muster dpkg-query
behandelt wird ./