3

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

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

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

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

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

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

4

4 回答 4

5

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

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

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

于 2010-01-12T12:24:17.630 回答
2

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

Korn shell 具有类似的功能,而 Z shell 具有更广泛的捕获能力。

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

于 2010-01-12T12:49:34.560 回答
2

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

If you want to do the oposite, like when it succeeds, just put your command instead of true:
true && echo "It succeeded"

于 2010-01-12T13:14:14.457 回答
1

.profile用户中添加:

trap grabface ERR
于 2010-01-12T12:24:40.413 回答