Dpkg
當參數以斜杠開頭時 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
為什麼上面的第三行會失敗?請注意,第一行以斜杠 (
/
) 開頭,因此這似乎不太可能成為問題。
據我所知,這沒有記錄在案,但領先者
/
將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
將任何以絕對路徑開頭/
的內容和不作為要匹配的模式的任何內容對待。