【问题标题】:Is it possible to detect *which* trap signal in bash? [duplicate]是否可以在 bash 中检测 *which* 陷阱信号? [复制]
【发布时间】:2010-02-01 09:23:35
【问题描述】:

可能重复:
Identifying received signal name in bash shell script

当使用 trap func_trap INT TERM EXIT 之类的东西时:

func_trap () {
    ...some commands...
}

功能块中有没有办法检测哪个陷阱调用了它?

类似:

func_trap () {
    if signal = INT; then
        # do this
    else
        # do that
    fi
}

或者我是否需要为每种不同的陷阱类型编写一个单独的函数? 是否有保存最新接收信号的 bash 变量?

提前致谢!

【问题讨论】:

    标签: bash bash-trap


    【解决方案1】:

    您可以实现自己的陷阱函数,自动将信号传递给函数:

    trap_with_arg() {
        func="$1" ; shift
        for sig ; do
            trap "$func $sig" "$sig"
        done
    }
    
    $ trap_with_arg func_trap INT TERM EXIT
    

    func_trap 的第一个参数是信号的名称。

    【讨论】:

    • +9000:您在 Bash 中使用 currying。太棒了。
    • 写起来可能比较清楚:for sig "$@"; do
    • @kevinarpe:那必须是for sig in "$@"; do - 可能更清楚,但for var ; do 是一个足够常见的习语(对我来说),它同样清楚。也避免了很多人陷入使用$@$*而不是"$@"的陷阱。
    • @camh,这个成语对我来说是全新的。此功能是否记录在某处?我在man bash 中找不到任何相关内容,也不知道该叫什么来搜索它。
    • @camh,谢谢,但我指的是你提到的for var ; do 成语。陷阱与此无关,AFAICT。好的,我想我刚刚找到了 一些 文档:“省略 for 循环的 in [list] 部分会导致循环在 $@ 上运行”,来自tldp.org/LDP/abs/html/loops1.html 中的示例 11-6。
    【解决方案2】:

    没有任何参数或变量保存被捕获信号的文档提示,因此您必须为每个要以不同方式表现的陷阱编写函数/陷阱语句。

    【讨论】:

    • 谢谢。这样可以节省我进一步挖掘的时间。
    猜你喜欢
    • 2016-12-18
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多