인수가 슬래시로 시작할 때 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*오류가 표시됩니다 . 예를 들어 다음 디렉터리는 존재하더라도 찾을 수 없습니다 .//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절대 경로로 시작하는 모든 항목은 /절대 경로로 처리되고, 패턴으로 처리되지 않는 항목은 일치하도록 처리됩니다.

관련 정보