同一bash进程中的多个陷阱

同一bash进程中的多个陷阱,bash,shell,signals,Bash,Shell,Signals,我想在我的.bashrc中加入几个函数。 这些函数可能会执行很长一段时间,因此我希望能够使用CTRL+C杀死它们,并在发生这种情况时打印一些信息。我可以通过捕获SIGINT来捕获CTRL+C,但是我不确定在同一个script.bashrc中为不同的函数设置不同的陷阱处理程序的正确方法是什么 我提出了一个似乎有效的解决方案: 函数foo { 陷阱“echo foo stopped”信号 虽然是真的;做 睡眠1 回音福工作。。。 完成 } 功能条 { 陷阱“回波条停止”信号 虽然是真的;做 睡眠1

我想在我的.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是一个好主意,它提供了一些我一直在寻找的隔离。