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

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

おすすめ記事