是否有可能在bash中检测*哪个*陷阱信号?

Wol*_*olf 23 bash bash-trap

可能重复:
在bash shell脚本中标识接收到的信号名称

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

func_trap () {
    ...some commands...
}
Run Code Online (Sandbox Code Playgroud)

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

就像是:

func_trap () {
    if signal = INT; then
        # do this
    else
        # do that
    fi
}
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

cam*_*amh 77

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

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

$ trap_with_arg func_trap INT TERM EXIT
Run Code Online (Sandbox Code Playgroud)

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

  • +9000:你在Bash中使用[currying](http://en.wikipedia.org/wiki/Currying).辉煌. (8认同)
  • 可以更清楚地写一下:`for sig"$ @"; do` (3认同)
  • @camh,这个习语对我来说是全新的。此功能是否记录在某处?我在 `man bash` 中找不到任何相关的东西,我不知道用什么来搜索它。 (3认同)
  • @kevinarpe:那必须是`for sig in"$ @"; do` - 可能更清楚,但`for var; do`是一个很常见的习惯用语(对我来说),它同样清晰.它也避免了使用`$ @`或`$*`而不是许多人陷入"$ @"的陷阱. (2认同)
  • @camh,谢谢,但我指的是 `for var ;做你提到的成语。陷阱与此无关,AFAICT。好的,我想我刚刚找到了*一些* 文档:_"Omitting the in \[list] part of a for loop导致循环对 $@"_ 进行操作,来自 http:/ 中的示例 11-6 /www.tldp.org/LDP/abs/html/loops1.html。 (2认同)
  • @markrian,这记录在 bash 手册页的“复合命令”下,其中记录了“for”命令,或者您可以在 bash 命令行运行“help for”,其中也描述了它。另外,在我之前的评论(现在不可编辑)中,我的意思是“*未*明确记录”。 (2认同)

nos*_*nos 7

没有文档提示任何包含被捕获信号的参数或变量,因此您必须为每个想要表现不同的陷阱编写一个函数/陷阱语句.