#!/bin/sh
trap 'trap - EXIT; echo exit' EXIT
trap 'echo term; exit' TERM
sleep 100
如果我运行kill
脚本的 shell 进程的 PID,它不会终止。如果我删除 TERM 陷阱并执行相同的操作,shell 将终止。为什么?同样,如果我替换sleep 100
为sleep 100 & wait
,shell 将由 终止kill
。
答案1
shell 仅在特定检查点(在命令末尾)检查未完成的陷阱,并且当它隐式等待正在运行的命令时,它就在此类检查点之前。
另一方面:如果您不使用trap .... TERM
,则该信号将按默认行为使用,即终止进程(甚至是 shell)。
如果使用trap .... TERM
,则不再具有 SIGTERM 的默认信号行为,这会阻止 shell 被终止。