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
私が知る限り、これは文書化されていませんが、リードは引数がパターンではなくパスとして扱われるようにします/
。つまり、次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
絶対パスで始まるすべての項目は/
絶対パスとして処理され、パターンとして処理されない項目は一致するように処理されます。