man -k 또는 Apropos는 일부 페이지를 찾을 수 없지만 man -a는 찾을 수 있는 이유는 무엇입니까?

man -k 또는 Apropos는 일부 페이지를 찾을 수 없지만 man -a는 찾을 수 있는 이유는 무엇입니까?

man -aw printf내 Pop!_OS 20.04 LTS 시스템에서 이것을 사용하면 다음이 반환됩니다.

/usr/share/fish/man/man1/printf.1
/usr/share/man/man1/printf.1.gz
/usr/share/man/man3/printf.3.gz

하지만 내가 man -k printfor man -f printf또는 를 사용하면 apropos printf그렇게 될 것입니다.오직다음에 대한 정보를 반환합니다.

/usr/share/man/man1/printf.1.gz
/usr/share/man/man3/printf.3.gz

왜 이 명령은 가능한 것을 찾지 못합니까 man -a?

이거 해봤는데 mandb업데이트할게 없네요.

답변1

다음은 귀하 man와 귀하의 친구가 다음 출신이라고 가정합니다.사람 데이터베이스. Pop!_OS가 Ubuntu를 기반으로 하고 Ubuntu 20.04에는 기본적으로 man-db가 설치되어 있다는 점을 고려하면 이는 올바른 것입니다.

man -f"whatis" 또는 "apropos" 모드(및 각각 apropos ) man -k에서 작동할 때 바이너리가 man실제로 호출 되고 검색이 위임됩니다. whatis반면에 기본 모드(예:) 또는 "where" 모드()에서 실행되면 바이너리 자체에서 검색이 수행됩니다. 및 검색 루틴은 서로 독립적으로 구현됩니다.man pageman -w pagemanmanwhatis

whatis더 적은 수의 매뉴얼 페이지가 나열 되는 두 가지 주요 이유는 다음과 같습니다 man -a.

  1. 불완전한 구성: 구성된 검색 경로 /etc/manpath.config(Debian 및 그 파생 제품, /etc/man_db.conf일부 다른 배포판에서 사용됨)에 매뉴얼 페이지가 포함된 시스템의 모든 디렉터리가 포함되어 있지만 그 MANDB_MAP중 일부가 파일에 없으면 인덱스 데이터베이스가 초기화되지 않았습니다(검색되지도 않음). , 존재하는 경우) 인덱스 데이터베이스만 검색하기 때문에 인덱스 데이터베이스가 아닌 man -a검색 경로에 나열된 디렉토리를 직접 검색하기 때문에 포함된 페이지는 어쨌든 발견됩니다 .whatis

  2. 매뉴얼 페이지를 포함하는 모든 디렉토리 에 올바른 MANDATORY_MANPATHMANDB_MAP항목이 있더라도 여전히 나열될 수 있습니다 /etc/manpath.config.whatisman -a그것은 단순히생략출력에 이름 부분 조합이 중복됩니다.. 귀하의 경우에는 printf(1)둘 다에서 발견되며 검색 경로에 처음 나타나는 디렉토리만 나열됩니다./usr/share/man/usr/share/fish/man

검색 경로가 사용될 manpathShow & Friends 명령을 사용하고 모든 관련 디렉토리가 포함되어 있는지 확인할 수 있습니다. man기본적으로 의 MANDATORY_MANPATH항목을 기반으로 작성 됩니다 /etc/manpath.config.

manMANPATH& Friends는 검색 결과 설정을 변경하여 명시적으로 정의된 검색 경로를 사용하여 호출할 수도 있습니다. 예를 들어 (2)의 상황에 처해 있다면,

MANPATH=/usr/share/fish/man:/usr/share/man whatis printf

에 대한 한 줄 설명 /usr/share/fish/man/man1/printf.1대신 에 대한 한 줄 설명이 인쇄될 수 있습니다 /usr/share/man/man1/printf.1.gz.

또한 이 옵션을 사용하여 뒤에서 무슨 일이 일어나고 있는지 확인할 수도 있습니다 --debug. 프로그램이 /usr/share/man이전에 나열된 검색 경로를 사용하고 /usr/share/fish/man있고 세 개의 파일이 모두 발견되었지만 printf섹션에서 발견된 두 번째 파일에 대한 행은 ( 또는 ) 1로 인쇄되지 않은 것으로 나타날 수 있습니다 .whatisman -f

마지막으로 사례 (2)를 해결하기 위해 man중복된 이름 부분 조합도 나열하도록 래핑하는 도우미 함수를 정의할 수 있습니다.

slowman () (
    IFS=:
    for path in ${MANPATH-$(manpath)}
    do
        printf '%s\n' "Searching ${path}:" 1>&2
        MANPATH="$path" man "$@"
    done
)

답변2

남자 남자:

   -w, --where, --path, --location
          Don't actually display the manual page, but do print  the  loca‐
          tion  of  the source nroff file that would be formatted.  If the
          -a option is also used, then print the locations of  all  source
          files that match the search criteria.

답변3

정확한 버전 man(1)(원래 Unix 버전인지 의심스럽습니다...) 및 구성(환경 변수, Linux MANPATH항목 - Debian의 실제 버전...)에 따라 다릅니다./etc/man_db.conf

관련 정보