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
위의 세 번째 줄이 실패하는 이유는 무엇입니까? 첫 번째 줄은 /
슬래시( )로 시작하므로 이는 문제가 되지 않을 것 같습니다.
답변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
절대 경로로 시작하는 모든 항목은 /
절대 경로로 처리되고, 패턴으로 처리되지 않는 항목은 일치하도록 처리됩니다.