在我的 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 printf
orman -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”模式(分别为和man -k
)下操作时,man
实际上调用whatis
二进制文件并将搜索委托给它。另一方面,当以其默认模式(例如)或“where”模式()运行时,搜索由二进制文件本身执行。和的搜索例程是彼此独立实现的。man page
man -w page
man
man
whatis
两个主要原因可能导致whatis
列出的手册页少于man -a
:
配置不完整:如果配置的搜索路径
/etc/manpath.config
(在 Debian 及其衍生版本上使用;/etc/man_db.conf
在其他一些发行版上)包括系统上包含手册页的所有目录,但该文件中没有MANDB_MAP
其中的某些目录,则索引数据库未初始化(也不搜索,如果存在的话);man -a
无论如何都会找到它们包含的页面,因为它直接搜索搜索路径中列出的目录,而whatis
不会,因为它只搜索索引数据库;即使包含手册页的所有目录在 中都有正确的
MANDATORY_MANPATH
和MANDB_MAP
条目/etc/manpath.config
,whatis
仍然可能列出比man -a
因为它只是简单地省略其输出中的重复名称-部分组合。在您的情况下,在和printf(1)
中均找到,并且仅列出在搜索路径中首先出现的目录中的目录。/usr/share/man
/usr/share/fish/man
您可以使用该manpath
命令显示man
&朋友将使用的搜索路径,并确保它包含所有相关目录。默认情况下,它是基于MANDATORY_MANPATH
中的条目构建的/etc/manpath.config
。
man
MANPATH
& 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