我有一个程序( grabface ),它使用网络摄像头拍摄人物的脸部照片,我还有一个shell脚本包装器,其工作方式如下:
在命令行上,用户为脚本提供要运行的程序的名称及其命令行参数。然后脚本执行给定的命令并检查退出代码。如果出现错误,则运行程序 grabface 以捕获用户的惊讶面孔。
这一切都很有效。但问题是必须始终使用包装器脚本。有没有办法在shell中输入命令时自动运行此脚本?或者是否有其他方法可以在任何程序运行后自动运行给定的程序?
优选地,解决方案应该在bash中工作,但是任何其他shell也可以。我意识到这可以通过简单地在shell的源代码中进行一些调整来实现,但这是最后一种措施。
可能更棘手的事情是扩展它以适应在shell外部启动的程序(例如从桌面环境中),但这可能太难了。
编辑: Awsome!由于bash太容易了,其他贝壳呢?
答案 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