引数がスラッシュで始まる場合の 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  

いったいなぜ、上記の 3 行目は失敗するのでしょうか? 1 行目はスラッシュ ( /) で始まっていることに注意してください。これが問題である可能性は低いようです。

答え1

これは私が知る限り文書化されていないが、先頭の/makeはdpkg引数をパターンではなくパスとして扱う。言い換えれば、で始まるものを検索するように指示した場合/、インストールされたパッケージの1つでそのファイルを探すものとみなされる。ちょうどパス。

簡単に確認できます

$ 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で始まるものはすべて絶対パスとして扱われ/、 で始まらないものはすべて一致するパターンとして扱われるようになります。

関連情報