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