【问题标题】:Multiple traps in the same bash process同一个 bash 进程中的多个陷阱
【发布时间】:2019-05-20 12:45:19
【问题描述】:

我想将几个功能放入我的.bashrc。 这些函数可能会执行很长时间,所以我希望能够用CTRL+C 杀死它们,并在发生这种情况时打印一些信息。我可以通过捕获SIGINT 来捕获CTRL+C,但我不确定为同一脚本中的不同函数设置不同的陷阱处理程序的正确方法是什么(.bashrc)。

我想出了这个似乎可行的解决方案:

function foo()
{
    trap 'echo "foo() stopped"' SIGINT
    while true; do
        sleep 1
        echo "foo() working..."
    done
}

function bar()
{
    trap 'echo "bar() stopped"' SIGINT
    while true; do
        sleep 1
        echo "bar() working..."
    done
}

示例输出:

$ foo
foo() working...
foo() working...
^Cfoo() stopped

$ bar
bar() working...
bar() working...
^Cbar() stopped

现在,我的问题是:

  1. 我是否正确理解每次我在函数内执行trap ... 时都会重置整个 bash 会话(进程)的信号处理程序?还是每次都创建一个新的处理程序?
  2. 一般来说这是一个好的解决方案,还是有更好的解决方案?

【问题讨论】:

    标签: bash shell signals


    【解决方案1】:

    是的,陷阱正在全局重置事物。函数结束时将其重置为原始值可能会很好。比如:

    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
    )
    

    【讨论】:

    • Subshel​​l 是个好主意,它提供了一些我正在寻找的“隔离”。
    猜你喜欢
    • 2011-03-21
    • 2018-04-11
    • 2011-07-10
    • 1970-01-01
    • 2016-12-18
    • 2023-03-13
    • 1970-01-01
    • 2015-06-06
    相关资源
    最近更新 更多