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*
,而使用了則/
它搜尋了確切的路徑/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
將以絕對路徑開頭的任何內容/
視為絕對路徑,而以非開頭的任何內容視為要匹配的模式。