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

时间:2014-11-19 09:07:13

标签: 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

所以我不确定它应该如何操作以及是否完全指定。

1 个答案:

答案 0 :(得分:2)

EXIT陷阱在每个shell中的工作方式都不一样。几个例子:

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

我建议你实际捕获信号然后退出,它应该是便携式的 穿过大多数炮弹:

$ 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