【问题标题】:How do I check if a man page exists?如何检查手册页是否存在?
【发布时间】:2012-09-03 03:38:56
【问题描述】:

我正在尝试编写一个脚本来将手册页转换为 PDF 文件。我现在的脚本是:

#! /usr/bin/env bash
[[ $# -ne 1 ]] && { echo "Usage: $(basename $0) [command]" ; exit 1 ; }
man -t ${1} | ps2pdf14 - > "${1}_man.pdf"

问题是如果手册页不存在,脚本仍然会继续执行,生成一个空的 PDF 文件。所以我想知道是否有办法确定手册页是否存在?

【问题讨论】:

  • 为什么不直接使用troff/groff?

标签: linux bash conditional-statements manual


【解决方案1】:

从函数中使用人的退出状态

man(1) 手册页定义了以下退出状态代码:

退出状态

0      Successful program execution.
1      Usage, syntax or configuration file error.
2      Operational error.
3      A child process returned a non-zero exit status.
16     At least one of the pages/files/keywords didn't exist or wasn't
       matched.

这意味着您可以使用 man 本身的退出状态来确定页面是否可以通过 manpath 获得。例如:

check_for_man_page () {
    man "$1" > /dev/null 2>&1
}

有了这个函数,你可以像这样对退出状态使用测试条件:

$ check_for_man_page "cat" && echo 'Found it!'
Found it!

$ check_for_man_page "quux" || echo 'Not found!'
Not found!

使用 If/Else 语句

这是执行此操作的另一种方法,使用 if/else 语句来确定是否运行您的原始代码:

if man "$1" > /dev/null 2>&1
then
    man -t ${1} | ps2pdf14 - > "${1}_man.pdf"
else
    echo "Missing man page: $1" >&2
fi

【讨论】:

  • 不管怎样,这些特定的退出状态值可能并不适用于所有平台。我的系统为缺少的手册页返回退出状态 1。
  • @MichaelHoffman 没关系。只要它以非零退出状态退出,你就知道 something 出了问题。如果 what 出了问题,那么您可以创建一个 case 语句,或者直接使用 $? 报告退出状态。
  • 这个用例没关系。
  • @CodeGnome 不知道 bash 函数会返回最后一个命令的退出状态。感谢您的功能。
【解决方案2】:

它并不整洁,但这似乎可以满足您的需求:

if man -w ${1} >/dev/null 2>/dev/null ; then
    man -t ${1} | ps2pdf14 - > "${1}_man.pdf"
fi

但是,一些手册页可能存在于手册的不同部分——例如man 1 printfman 3 printf。您可能希望修改您的脚本以考虑到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 2011-05-15
    相关资源
    最近更新 更多