Поведение dpkg -S, когда аргумент начинается с косой черты

Поведение dpkg -S, когда аргумент начинается с косой черты
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рассматривать все, что начинается с /, как абсолютный путь, а все, что не начинается с , как шаблон для сопоставления.

Связанный контент