Dpkg

當參數以斜杠開頭時 dpkg -S 的行為

  • October 11, 2014
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  

為什麼上​​面的第三行會失敗?請注意,第一行以斜杠 ( /) 開頭,因此這似乎不太可能成為問題。

據我所知,這沒有記錄在案,但領先者/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

雖然我在手冊頁中找不到任何提及,但我確實通過檢查源來確認。以下幾行來自(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將任何以絕對路徑開頭/的內容和不作為要匹配的模式的任何內容對待。

引用自:https://unix.stackexchange.com/questions/160506