如何使`man`适用于shell内置命令和关键字?
当我想获取有关特定命令的信息时,我一直使用man
命令。 但是,当特定命令是内置shell时,这对我没有多大帮助。 例如:
man cd
收益:
No manual entry for cd
我的问题是:有可能使man
也适用于所有shell内置命令(如cd
, alias
, history
等)和关键字(如if
, while
, [[
, {
,等等)?
与-m
选项一起使用时的help
命令可以以伪手册页格式显示有关内置命令的信息。 例如:
help -m cd | less
将以几乎与手册页中完全相同的格式显示有关cd
命令的信息。
从此命令开始,您可以将man
命令包装在.bashrc
文件中的一个函数中,如下所示:
man () { case "$(type -t -- "$1")" in builtin|keyword) help -m "$1" | sensible-pager ;; *) command man "$@" ;; esac }
在这个man
之后也将为所有shell内置命令和关键字工作。 例如:
man :
将显示:
NAME : - Null command. SYNOPSIS : DESCRIPTION Null command. No effect; the command does nothing. Exit Status: Always succeeds. SEE ALSO bash(1) IMPLEMENTATION GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later
man bash-builtins
这包含内置命令的帮助片段,虽然它的格式比help
等效格式稍微浓缩一些。
您可以安装有关使用POSIX系统进行开发的手册页,
sudo apt-get install manpages-posix-dev
它将为shell内置函数提供手册页。
$ type cd cd is a shell builtin
现在试试,
$ man cd CD(P) POSIX Programmer's Manual CD(P) NAME cd - change the working directory SYNOPSIS cd [-L | -P] [directory] ...
这个解决方案效果非常好,但也是一个笑话,因为我在阅读你的问题时首先想到的是“谁还在字面上使用命令行中的人? 不是每个人都只是谷歌他们想要的手册页(所以他们得到像无限滚动这样的花哨的东西)?’ 然后我意识到我谷歌的网站通常都有两种类型的命令,所以为什么不用它们来提供跨所有命令的统一手册页界面。 因此,这种乐趣诞生了。
这需要互联网连接至少一次您尚未查找过的任何条目。 它还需要这两个在Ubuntu的默认安装中缺少的小应用程序:
sudo apt-get install tidy html2text
这些并不是绝对必要的,但它们确实有助于使它看起来更好一些。 Tidy将清理HTML和html2text将html格式化为格式化文本(这通常非常简单,因为大多数这些网站已经是文本格式并且只包含在
标签中。
现在你需要做的就是将它添加到~/.profile
的末尾:
function iman() { if [ ! -d "/usr/share/iman" ]; then sudo mkdir -ma=rwx /usr/share/iman fi if [ ! -f "/usr/share/iman/$1.html" ]; then curl "http://unixhelp.ed.ac.uk/CGI/man-cgi?$1"| tidy -n -asxml 2>/dev/null| html2text > "/usr/share/iman/$1.html"; fi if [ -f "/usr/share/iman/$1.html" ]; then cat "/usr/share/iman/$1.html"; else echo "Entry not found." fi }
在您注销然后重新登录后,您应该可以输入以下内容:
iman cd
它将显示cd
的手册页。
这使用数据目录(/ usr / share / iman)以最小化我们的网络要求(因此即使没有连接,它也适用于您之前已经找到的条目;也可以最小化此随机Linux手册页网站上的负载我找到了我们想要的系统条目。 如果您不再使用它,您将要删除它以恢复磁盘空间。
希望其余的都很直接。