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*
, 를 사용하면 /
정확한 path 를 검색한 것으로 표시됩니다 /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;
}
*
해당 인수가 a로 시작하지 않는 한 전달된 인수 주위에 추가됩니다 /
. 따라서 dpkg-query
로 시작하는 모든 항목은 절대 경로로 처리 /
되고 일치할 패턴으로 처리되지 않는 항목은 모두 처리됩니다.