如果另一个程序返回错误,则自动运行程序

时间:2010-01-12 12:20:22

标签: bash shell scripting exit-code

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

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

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

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

可能更棘手的事情是扩展它以适应在shell外部启动的程序(例如从桌面环境中),但这可能太难了。

编辑: Awsome!由于bash太容易了,其他贝壳呢?

4 个答案:

答案 0 :(得分:5)

在Bash中,只要执行的命令返回非零值,就可以使用带有ERR参数的trap command来执行指定的命令。

$ trap "echo 'there was an error'" ERR
$ touch ./can_touch
$ touch ./asfdsafds/fdsafsdaf/fdsafdsa/fdsafdasfdsa/fdsa
touch: cannot touch `./asfdsafds/fdsafsdaf/fdsafdsa/fdsafdasfdsa/fdsa': No such file or directory
there was an error

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

只需将我的命令替换为我的错误。
false || echo "It failed"

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

答案 3 :(得分:1)

在用户的.profile中添加:

trap grabface ERR
相关问题