如何设置 MANPATH 而不覆盖默认值?

如何设置 MANPATH 而不覆盖默认值?

$PATH我已通过导出添加了额外的目录PATH=/my/dirs:$PATH ,但我不确定是否应该对执行相同操作MANPATH。因为默认MANPATH值为空,但man命令有效。我找到了一个名为的命令manpath,其手册上写着。这是否意味着设置 MANPATH 不是为命令添加目录以搜索手册页的If $MANPATH is set, manpath will simply display its contents and issue a warning.正确方法?man

答案1

如果您只是设置 MANPATH,它将覆盖默认值,您将无法访问标准手册页。例如,man ls在设置 MANPATH 之前有效,但在设置 MANPATH 之后无效。

要附加搜索目录而不覆盖默认目录,请在 MANPATH 前面加上冒号,如下所示:

export MANPATH=":/path/to/custom/man"

添加冒号可让您访问标准系统手册页和 MANPATH 变量中引用的自定义页面。

此答案由人路(1)

如果设置了 $MANPATH,manpath 将显示其值,而不是动态确定它。如果 $MANPATH 以冒号为前缀,则变量的值将附加到根据配置文件内容确定的列表中。如果冒号位于变量值的末尾,则确定的列表将附加到变量的内容中。如果变量的值包含双冒号 (::),则确定的列表将插入到值的中间,即两个冒号之间。

答案2

虽然标题特别提到了这个MANPATH变量,但我相信这个问题的原作者部分暗示的是有一种方法可以“添加”手册页到系统中,而无需首先触及 MANPATH 变量

因此,除了可以接受的答案之外,我还想指出,在标准配置中,该manpage命令似乎还会查看PATH.

我还没有找到相关文档,但从个人实验来看,我认为其工作方式如下:

假设您的 PATH 中有一个名为 的目录/dir1/dir2/dir3/dir4

然后,dir4作为出色地因为它的父级(即dir3)将被搜索manpath,并且如果man其中一个目录包含一个名为或 的子目录share/man,那么相关的“man”目录将被添加到命令的输出中manpath

实际上,这意味着,例如,如果/home/user/.local/bin在您的路径中,并且您还有一个名为 的目录/home/user/.local/share/man,则将拾取其中包含的任何手册页。同样,如果/opt/nano/bin在您的路径中,/opt/nano/share/man则将拾取类似 的内容。

请注意,我说的“拾取”是指该manpath命令将在其输出中包含该目录!这些目录的内容仍然需要与 for 兼容,man以便man从其中拾取有效的手册页。换句话说,您的home/user/.local/share/man目录应该包含一个man1包含大量.1文件的目录、一个man5包含大量.5文件的目录等。groff 格式

更新:根据下面的评论,manpath从 man-db 2.10.0 开始,手册页现在完整记录了这种行为。

答案3

您应该在末尾添加自定义目录PATH

PATH=$PATH:/my/dirs

这样,您的自定义目录就不会覆盖系统二进制文件和库,这可能会导致安全问题。

您可以以MANPATH相同的方式设置(MANPATH默认为空):

MANPATH=$MANPATH:/my/dirs

您不需要设置一个MANPATH具有良好行为的软件包,因此如果它没有损坏,就不要修复它。如果它损坏了,也许您最好提交错误报告 ;)

将其添加到~/.bashrc

export PATH=$PATH:/my/dirs
export MANPATH=$MANPATH:/my/dirs

相关内容