【问题标题】:Automatically run a program if another program returns an error如果另一个程序返回错误,则自动运行一个程序
【发布时间】:2010-01-12 12:20:22
【问题描述】:

我有一个程序 (grabface),它使用网络摄像头拍摄人脸的照片,我还有一个外壳脚本包装器,其工作原理如下:

在命令行上,用户为脚本提供要运行的程序的名称及其命令行参数。然后脚本执行给定的命令并检查退出代码。如果出现错误,则运行程序 grabface 以捕捉用户惊讶的面孔。

这一切都很好。但问题是必须始终使用包装脚本。每当在 shell 中输入命令时,是否有某种方法可以自动运行此脚本?或者是否有其他方法可以在任何程序运行后自动运行给定程序?

最好该解决方案应该在 bash 中运行,但任何其他 shell 也可以。我意识到这可以通过简单地对 shell 的源代码进行一些调整来实现,但这是最后的措施。

可能更棘手的事情是将其扩展为也适用于在 shell 之外启动的程序(例如从桌面环境),但这可能太难了。

编辑:太棒了!既然 bash 这么简单,那其他的 shell 呢?

【问题讨论】:

    标签: bash shell scripting exit-code


    【解决方案1】:

    在 Bash 中,您可以使用 trap commandERR 参数在执行的命令返回非零时执行指定的命令。

    $ trap "echo '有一个错误'" ERR $ 触摸 ./can_touch $ 触摸 ./asfdsafds/fdsafsdaf/fdsafdsa/fdsafdasfdsa/fdsa 触摸:无法触摸`./asfdsafds/fdsafsdaf/fdsafdsa/fdsafdasfdsa/fdsa':没有这样的文件或目录 有一个错误

    trap 会影响整个会话,因此您需要确保在会话开始时调用trap,方法是将其放入.bashrc.profile

    【讨论】:

      【解决方案2】:

      Bash 理解的其他特殊trap 信号有:DEBUG、RETURN 和 EXIT 以及所有系统信号(可以使用trap -l 列出)。

      Korn shell 具有类似的功能,而 Z shell 具有更广泛的陷阱功能。

      顺便说一下,在某些情况下,对于命令行,在 Bash 中将 PROMPT_COMMAND 变量设置为每次发出提示时都会运行的脚本或命令会很有用。

      【讨论】:

        【解决方案3】:

        只需在我有错误的地方替换你的命令即可。
        false || echo "It failed"

        如果你想做相反的事情,比如成功时,只需输入你的命令而不是 true:
        true && echo "It succeeded"

        【讨论】:

        • 当然,但这并不能真正回答问题。正如我已经说过的,我有一个基本上可以做到这一点的包装脚本。我想知道的是如何让脚本运行而无需在 shell 中输入任何额外内容(如示例中的 '|| echo "It failed"')
        • 没有回答发帖者的问题,但正是我想要的。
        【解决方案4】:

        在用户的.profile中添加:

        trap grabface ERR
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-19
          • 2013-05-12
          • 2011-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多