为什么 man -k 或 Apropos 找不到某些页面而 man -a 可以?

为什么 man -k 或 Apropos 找不到某些页面而 man -a 可以?

在我的 Pop!_OS 20.04 LTS 系统上,如果我使用man -aw printf它将返回:

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

但如果我使用man -k printforman -f printfapropos 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”模式(分别为和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.configwhatis仍然可能列出比man -a因为它只是简单地省略其输出中的重复名称-部分组合。在您的情况下,在和printf(1)中均找到,并且仅列出在搜索路径中首先出现的目录中的目录。/usr/share/man/usr/share/fish/man

您可以使用该manpath命令显示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并未由whatis( 或man -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

相关内容