在收到SIGINT或SIGTERM的情况下,是否需要执行陷阱EXIT



我有一个简单的脚本

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

它在不同的外壳中表现不同:

$ bash tst.sh
^Cexit
$ dash tst.sh
^C
$ zsh tst.sh
^C
$ sh tst.sh
^Cexit

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

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

最新更新