shell - 如果收到 SIGINT 或 SIGTERM,是否需要执行 trap EXIT?

标签 shell error-handling signals shell-trap

我有一个简单的脚本

trap 'echo exit' EXIT
while true; do sleep 1; done

它在不同的 shell 中表现不同:
$ bash tst.sh
^Cexit
$ dash tst.sh
^C
$ zsh tst.sh
^C
$ sh tst.sh
^Cexit

所以我不确定它应该如何运作以及它是否被指定。

最佳答案

EXIT trap 在每个 shell 中的工作方式不同。几个例子:

  • 在 dash 和 zsh 中,它仅由脚本中的常规退出触发。
  • 在 zsh 中,如果捕获通常会退出执行的信号,则需要
    通过显式调用 exit 恢复默认行为.

  • 我建议你实际捕捉信号然后退出,它应该是可移植的
    在大多数 shell 中:
    $ cat trap
    trap 'echo exit; exit' INT TERM  # and other signals
    while true; do sleep 1; done
    $ bash trap
    ^Cexit
    $ dash trap
    ^Cexit
    $ zsh trap
    ^Cexit
    $ ksh trap
    ^Cexit
    $ mksh trap
    ^Cexit
    $ busybox sh trap
    ^Cexit
    

    关于shell - 如果收到 SIGINT 或 SIGTERM,是否需要执行 trap EXIT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27012762/

    相关文章:

    python - shell脚本,使用输入执行程序并在输出中保存输入与输出结合

    python - 需要将csv文件合并成一个然后将csv导入到mysql中的表中

    asp.net - 经典的ASP错误捕获-可以直接使用ASP.Net页面完成吗?

    c - 我在主进程和他的子进程之间共享 C 内存,但我无法同步他们的操作

    iphone - 我不断收到 Thread 1 : signal SIGABRT in Xcode

    linux - 在文件中的变量完全匹配后打印第二列值

    perl - 将参数从 shell 脚本传递给 perl 程序不保留空格

    swift - 为什么我的for-in循环不起作用? swift 处理错误

    c++ - 这个宏是否有问题 - 检查状态并在失败时返回

    python - 从回调发出信号时,Python应用程序崩溃