当参数以斜线开头时 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

请注意,在第一种情况下,使用 no 时/,错误显示它搜索的是*nomatching*,而使用 the 时,错误/显示它搜索的是确切的路径/nonmatching。例如,/doc尽管存在以下目录,但它也无法找到/usr/share/doc

$ dpkg -S /doc
dpkg-query: no path found matching pattern /doc

虽然我在手册页中找不到任何提及这一点的内容,但我确实通过检查来源进行了确认。以下行来自(dpkg 1.17.13)searchfiles中定义的函数querycmd.c

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将以绝对路径开头的任何内容/视为绝对路径,而以非开头的任何内容视为要匹配的模式。

相关内容