使用重定向的stdin调用man来显示BASH脚本中的帮助

时间:2015-10-01 17:06:29

标签: bash

为什么使用带有重定向的stdin的man来显示BASH脚本中的帮助是一个坏主意还是与BASH的所有(在合理范围内)版本兼容,是否有任何理由?

该技术可以很好地使用我可以轻松访问的两个版本的BASH:GNU BASH v.4.3.11和4.3.30(都在Linux上)。在我看来,在脚本中显示脚本帮助的优雅方式是,当下载它的人不太可能打扰安装手册页时,手册页已经被编写。

下面是我的意思的一个简单的例子。在命令行上使用help选项时将调用display_usage_message函数,并且当函数返回时脚本将调用exit

#!/bin/bash

display_usage_message()
{
man /dev/stdin <<EOF

.TH SCRIPT 1 "01 Oct 2015" "1.0" "SCRIPT VERSION 1.0"

.SH NAME
Script \- whatever it does.

.SH SYNOPSIS
script options etc.

.SH DESCRIPTION
This is a description which is not very long. :)
EOF
}

display_usage_message
exit

感谢。

编辑:根据chepner的评论,这种轻微变化是否可靠?

#!/bin/bash

display_usage_message()
{

temp_man_filename=$(mktemp -q -t "tmp.man.page.XXXXXX")

cat <<EOF >>$temp_man_filename

.TH SCRIPT 1 "01 Oct 2015" "1.0" "SCRIPT VERSION 1.0"

.SH NAME
Script \- whatever it does.

.SH SYNOPSIS
script options etc.

.SH DESCRIPTION
This is a description which is not very long. :)
EOF

man $temp_man_filename

rm $temp_man_filename
}

display_usage_message
exit

1 个答案:

答案 0 :(得分:0)

期望帮助信息是一个简短的 - 理想情况下,不是一个屏幕 - 提醒可用的功能,而手册相反应该解释概念和文档错误消息,退出代码,操作限制,等

更基本的是,将部分或全部文档保留在源代码中或与源代码相结合是良好的做法,积极推广,例如在Knuth的Literate Programming中并通过例如(例如,可能不那么严格和正式)实践Perl POD和Javadoc作者。

顺便说一下,man标记在这个时代感觉有些模糊。也许你会想要探索POD或Markdown作为更友好,更现代的替代方案(虽然不太适合高级用途)。 POD很容易嵌入到shell脚本中,格式化工具将安装在Perl的任何地方。