如何在mac os x

时间:2015-05-16 11:06:43

标签: macos shell emacs permissions man

我正在尝试在Mac OS X 10.9.5上安装bash脚本的手册页。我试图遵循的程序总结如下:man page tutorial。我还总结了我在下面尝试的步骤:

cp custom_command.1 /usr/local/man/man1/custom_command.1
gzip /usr/local/man/man1/custom_command.1

尝试man custom_command时,我会收到输出No manual entry for custom_command。我还尝试了man page tutorial中提到的其他安装方法。

有趣的是,上面的步骤适用于emacs控制台,即当我输入man custom_command时,我确实得到了正确的手册。但是,自动完成功能无法识别该命令,并且在我能够阅读手册之前收到以下警告:WARNING: terminal is not fully functional

有关如何解决上述问题的任何建议(即使用系统终端和emacs控制台)都将不胜感激。

备注1

作为参考,我尝试安装的man脚本取自tutorial,并在下面重述以供参考:

.\" Manpage for nuseradd.
.\" Contact vivek@nixcraft.net.in to correct errors or typos.
.TH man 8 "06 May 2010" "1.0" "nuseradd man page"
.SH NAME
nuseradd \- create a new LDAP user
.SH SYNOPSIS
nuseradd [USERNAME]
.SH DESCRIPTION
nuseradd is high level shell program for adding users to LDAP server.  On Debian, administrators should usually use nuseradd.debian(8) instead.
.SH OPTIONS
The nuseradd does not take any options. However, you can supply username.
.SH SEE ALSO
useradd(8), passwd(5), nuseradd.debian(8)
.SH BUGS
No known bugs.
.SH AUTHOR
Vivek Gite (vivek@nixcraft.net.in)

6 个答案:

答案 0 :(得分:12)

首先,您可能需要检查您尝试安装的手册页是否格式正确,并且可以通过man命令打开。为此,请将man文件的路径传递给man命令。它必须包含斜杠才能被识别为路径,例如:

man /usr/local/man/man1/custom_command.1

然后,您应确保将您的手册页安装到的路径位于man命令的搜索列表中。为了找到手册页,其路径必须是:

  • 使用-M命令的man选项指定
  • 在环境变量MANPATH
  • 中设置
  • 在其/private/etc/man.conf语句下或MANPATH语句下的配置文件(OS X上为MANPATH_MAP)中列出(仅适用于PATH环境变量中的位置)< / LI>
  • 位于相对于安装二进制文件的位置,即:如果path/bin中安装了二进制文件,则会在path/manpath/catpath/bin/man中搜索手册页,path/bin/cat
  • /private/etc/manpaths.d/目录
  • 中添加的文件中列出

手册页文件的名称必须与带有可选节号的命令名称相同。它可能是gzip压缩。

要查看man将搜索您的custom_command手册页

的位置
man -d custom_command

答案 1 :(得分:7)

OS X用户命令手册页通常在以下位置创建:

/usr/local/share/man/man1

如果您希望在不同的目录中创建手册页,请编辑:

/private/etc/man.conf

然后将新路径添加到MANPATH_MAP,例如:

MANPATH_MAP     /usr/local/bin         /usr/local/man

让man搜索具有默认回退(/usr/local/share/man)的非默认路径:

MANPATH         /usr/local/man      
MANPATH         /usr/local/share/man 
MANPATH_MAP     /usr/local/bin         /usr/local/share/man

答案 2 :(得分:2)

我已经通过brew安装了软件包,但是man命令是空白的,因为我已经将brew安装到了另一个目录。 为了解决这个问题,仍然链接包(将内容链接到几个目录),我可以在我的.bash_profile中添加MANPATH,就像这样......

MANPATH="/Users/me/Developer/share/man:$MANPATH"

答案 3 :(得分:0)

MacOS X中的手册页

MacOS X中的man命令使用一种复杂的方法来查找手动页面文件,该文件基于调用选项和环境变量,/ private / etc / man.conf配置文件以及一些内置的约定和启发式方法。

在MacOS X中,您有一个命令:

/usr/bin/manpath 

该列表列出了您当前用于搜索手册页的所有位置。 只需输入即可调用

manpath

在终端中。

但是它不会将其添加到$ MANPATH shell变量中。

但是您仍然可以使用man命令访问手册页。

中定义了manpath中包含的内容。
/private/etc/man.conf

不建议在不添加以下输出的情况下导出名为MANPATH的环境变量

`manpath` 

到列表。

因此,如果要将$ MANPATH导出到您的Shell环境中,请执行以下操作:

export MANPATH="`manpath`:/path/to/man/pages/to/include"

这样,您将获得操作系统定义的联机帮助页的完整列表以及您添加的任何路径。

有关更多信息,请打开终端并检查:

man manpath

以及带有以下内容的man.conf文件:

more /private/etc/man.conf

通常,在特殊位置包含手册页的一个更好的选择是在/ usr / local / share / man中创建一个指向包含手册页的目录的符号链接,默认情况下,该目录由“ man生态系统”索引。 >

答案 4 :(得分:0)

除了baf's answer中指出的所有条目之外,还有/etc/manpaths,它非常方便用于包含通过Homebrew安装的手册页。

例如,以下是我的/etc/manpaths的内容:

/usr/local/opt/coreutils/libexec/gnuman
/usr/local/opt/findutils/libexec/gnuman
/usr/local/opt/gawk/libexec/gnuman
/usr/local/opt/gnu-sed/share/man
/usr/local/opt/readline/share/man
/usr/local/share/man
/usr/share/man

同时确保在/etc/profile中,MANPATH在加载path_helper之前已定义:

export MANPATH=  # hack: path_helper doesn't setup MANPATH without this
eval `/usr/libexec/path_helper -s`

顺便说一句,在macOS中,默认的传呼机为/usr/bin/less有点旧,并且甚至不支持\b的正则表达式中的单词边界,因此您可能需要设置MANPAGER~/.bashrc中(或您喜欢的某个地方):

export MANPAGER=/usr/local/bin/less

答案 5 :(得分:0)

虽然现有答案确实提供了一些有助于解决 OP 问题的提示/选项,但它们实际上并未回答标题中的问题。

确实,为了让 man 程序打开手册页,它应该知道去哪里寻找它。这是一个明显的声明,但它没有多大帮助。问题是您是否应该使用一些“标准”位置(如果是,那些“标准”查找路径是什么,它们在哪里定义),或者您应该将手册页与您的程序一起放置,并以某种方式指向 { {1}} 编程到您的自定义位置?

OP 似乎已尝试将手册页置于他认为是“标准”的位置 (man),但 /usr/local/man 并未意识到这一点。

如果使用 man 而不是 /usr/local/man/man1/custom_command.1,它应该可以工作。你怎么会知道这个?答案在 /usr/local/share/man/man1/custom_command.1 中:

/etc/man.conf

# # Every automatically generated MANPATH includes these fields # MANPATH /usr/share/man MANPATH /usr/local/share/man MANPATH /usr/X11/man MANPATH /Library/Apple/usr/share/man 用于配置默认的 manpath(提供的示例来自 macOS Big Sur 中的默认 man.conf)。话虽如此,我认为依赖 /etc/man.conf 默认配置并简单地将自定义程序/脚本的手册页复制到这些目录之一是正确的做法。

原因是默认的 manpath 是根据 man.conf only 配置的,如果 man.conf 环境变量未设置或为空。如果 $MANPATH 环境变量设置/不为空,则 $MANPATH 中的路径不用于查找手册页。

默认情况下,未设置 /etc/man.conf。但是如果你的程序/脚本+手册页会分发给其他用户,你就不能确定它是否设置在那里。

那么,什么是可靠的解决方案?在我看来,将手册页与脚本一起发送,并使用 $MANPATHpath_helper 以获取更多信息)将 man path_helper 指向自定义 manpath 是第三个最佳方法-派对节目。

对于程序/脚本作者来说,唯一需要做的就是将包含程序手册页路径的文件放入 man 目录中。 /etc/manpaths.d 应该做剩下的。

似乎 path_helper 是专门为此类用例设计的,并且它正被第三方程序使用(我在安装 Wireshark 并尝试使其手册页可被发现后了解到它),但是有一个警告:

path_helper 不会让 path_helper 了解您的自定义 manpath,如果之前未设置 man 环境变量(正如我们所知,默认情况下未设置)。来自 $MANPATH 手册页:

<块引用>

(MANPATH 环境变量不会被修改,除非它已经在环境中设置。)

这就是您实际上想要设置 path_helper 的原因,以允许 $MANPATH 之后使用自定义 manpath 对其进行扩充。

就我而言,我将 path_helper(只是为了设置它,没有任何值)添加到 export MANPATH(我使用的是 macOS Big Sur,/etc/zshenv 是默认外壳),并且 { {1}} 成功添加了 zsh 文件中的所有自定义 manpath。