인수가 슬래시로 시작할 때 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  

대체 왜 위의 세 번째 줄이 실패합니까? 첫 번째 줄은 슬래시( /)로 시작하므로 문제가 될 것 같지 않습니다.

답변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로 시작하는 모든 항목은 절대 경로로 처리 /되고 일치할 패턴으로 처리되지 않는 항목은 모두 처리됩니다.

관련 정보