【问题标题】:How can I "try to do something and then detect if it fails" in bash?如何在 bash 中“尝试做某事然后检测它是否失败”?
【发布时间】:2011-11-07 06:34:25
【问题描述】:

在对上一个问题的回答中:

How can I use 'do I have root access?' as a conditional in bash?

建议“尝试做某事并检测它是否失败”而不是“检查权限然后做某事”

我为此找到了很多理由,例如:

但是,关于如何在 bash 中实现 try/catch,我几乎没有找到明确的信息。我想这太容易了,除了我发现的东西似乎相当复杂——使用函数或其他脚本:

我对 bash 比较陌生,但很困惑,没有类似于其他语言中的 try 函数的简单函数。

具体来说,我想做以下事情:

CMD=`./path/to/script.sh`
if [ <echo $CMD | grep error is true> ]; then
        .. do this ..
else 
        .. do that ..
fi   

【问题讨论】:

标签: bash if-statement try-catch


【解决方案1】:

Bash 取决于 退出状态,因此没有任何 try/catch 等效项。但它仍然可以满足您的需求。

对于简单的情况,可以使用

[[ your_test_expression ]] && commands

这相当于

if [[ your_test_expression ]]; then
    commands
fi

If 使用 [[ ... ]] 的“退出状态”,所以实际上你可以在if 之后使用任何命令。只需确保您的控制逻辑取决于命令的退出状态即可。

对于复杂的情况,你仍然需要ifcase语句来表达你的逻辑。

【讨论】:

    【解决方案2】:

    除非您调用的脚本有退出条件,否则您无能为力。但是在 bash 手册页中查找“set”。

    set -e
    

    如果其中的简单命令失败,将导致脚本退出。您可以在示例中将其添加到 script.sh 的顶部,以使其在失败时退出。

    还看trap。我相信

    trap 'exit 2' ERR
    

    相似

    【讨论】:

      【解决方案3】:
      if sudo chmod a-x /etc/shadow 2>/dev/null
      then : Yes - I have root permissions
      else : No - I do not have root permissions or /etc/shadow does not exist or ...
      fi
      

      这会选择一个如果成功则不会造成损害的操作(影子密码文件不应该是可执行的;您可以执行chmod o-w /之类的操作 - 如果您愿意,可以从根目录中删除公共写权限),然后检查它通过查看命令的退出状态来工作。这会丢弃错误消息 - 您必须决定这是否重要。

      “sudo”是用来提升权限的;如果您认为用户应该已经是“root”,则省略“sudo”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-17
        • 2012-12-30
        • 2016-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多