同一bash进程中的多个陷阱
我想在我的.bashrc中加入几个函数。 这些函数可能会执行很长一段时间,因此我希望能够使用CTRL+C杀死它们,并在发生这种情况时打印一些信息。我可以通过捕获SIGINT来捕获CTRL+C,但是我不确定在同一个script.bashrc中为不同的函数设置不同的陷阱处理程序的正确方法是什么 我提出了一个似乎有效的解决方案: 函数foo { 陷阱“echo foo stopped”信号 虽然是真的;做 睡眠1 回音福工作。。。 完成 } 功能条 { 陷阱“回波条停止”信号 虽然是真的;做 睡眠1 回音条工作。。。 完成 } 示例输出:同一bash进程中的多个陷阱,bash,shell,signals,Bash,Shell,Signals,我想在我的.bashrc中加入几个函数。 这些函数可能会执行很长一段时间,因此我希望能够使用CTRL+C杀死它们,并在发生这种情况时打印一些信息。我可以通过捕获SIGINT来捕获CTRL+C,但是我不确定在同一个script.bashrc中为不同的函数设置不同的陷阱处理程序的正确方法是什么 我提出了一个似乎有效的解决方案: 函数foo { 陷阱“echo foo stopped”信号 虽然是真的;做 睡眠1 回音福工作。。。 完成 } 功能条 { 陷阱“回波条停止”信号 虽然是真的;做 睡眠1
$ foo
foo() working...
foo() working...
^Cfoo() stopped
$ bar
bar() working...
bar() working...
^Cbar() stopped
现在,我的问题是:
我是否正确理解每次我做陷阱。。。在一个函数中,它为整个bash会话过程重置信号处理程序?还是每次都要创建一个新的处理程序?
总体而言,这是一个好的解决方案,还是有更好的解决方案?
是的,陷阱是全球性的。当函数结束时,最好将其重置为原始值。比如:
foo() {
old=$(trap -p SIGINT)
trap 'echo "foo() stopped"' SIGINT
...
eval set -- "$old"
trap "$3" SIGINT
}
OTOH,将函数作为子shell运行可能更健壮,这只会产生为子shell设置陷阱的效果。执行此操作与在函数定义中使用和一样简单:
foo()
(
trap 'echo "foo() stopped"' SIGINT
while true; do
sleep 1
echo "foo() working..."
done
)
是的,陷阱正在全球范围内重新设置。当函数结束时,最好将其重置为原始值。比如:
foo() {
old=$(trap -p SIGINT)
trap 'echo "foo() stopped"' SIGINT
...
eval set -- "$old"
trap "$3" SIGINT
}
OTOH,将函数作为子shell运行可能更健壮,这只会产生为子shell设置陷阱的效果。执行此操作与在函数定义中使用和一样简单:
foo()
(
trap 'echo "foo() stopped"' SIGINT
while true; do
sleep 1
echo "foo() working..."
done
)
Subshell是一个好主意,它提供了一些我一直在寻找的隔离。Subshell是一个好主意,它提供了一些我一直在寻找的隔离。