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

相關內容