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
Почему, черт возьми, третья строка выше не работает? Обратите внимание, что строка первая начинается со слеша ( /
), так что вряд ли это проблема.
решение1
Насколько я могу судить, это не документировано, но ведущий /
заставляет dpkg
рассматривать аргумент как путь, а не шаблон. Другими словами, если вы говорите ему искать что-то, что начинается с /
, он предполагает, что он должен искать файл в одном из установленных пакетов с этимточныйпуть.
Вы можете легко это подтвердить с помощью
$ dpkg -S nonmatching
dpkg-query: no path found matching pattern *nonmatching*
$ dpkg -S /nonmatching
dpkg-query: no path found matching pattern /nonmatching
Обратите внимание, что в первом случае, без /
, ошибка показывает, что он искал *nomatching*
, тогда как с /
он искал точный путь /nonmatching
. Например, он также не может найти, /doc
несмотря на существование таких каталогов, как /usr/share/doc
:
$ dpkg -S /doc
dpkg-query: no path found matching pattern /doc
Хотя я не могу найти никаких упоминаний об этом на странице руководства, я подтвердил это, проверив источник. Следующие строки взяты из функции, searchfiles
определенной в 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;
}
Это добавит *
вокруг переданного аргумента, если только этот аргумент не начинается с /
. Таким образом, это заставляет dpkg-query
рассматривать все, что начинается с /
, как абсолютный путь, а все, что не начинается с , как шаблон для сопоставления.