收到SIGINT或SIGTERM时是否需要执行trap EXIT?

Ixa*_*zis 7 error-handling shell signals shell-trap

我有一个简单的脚本

trap 'echo exit' EXIT
while true; do sleep 1; done
Run Code Online (Sandbox Code Playgroud)

并且它在不同的shell中表现不同:

$ bash tst.sh
^Cexit
$ dash tst.sh
^C
$ zsh tst.sh
^C
$ sh tst.sh
^Cexit
Run Code Online (Sandbox Code Playgroud)

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

iza*_*era 5

EXITtrap 在每个 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
Run Code Online (Sandbox Code Playgroud)