#!/bin/sh
trap 'trap - EXIT; echo exit' EXIT
trap 'echo term; exit' TERM
sleep 100
kill
シェルプロセスのPIDでスクリプトを実行しても終了しません。 TERMトラップを削除して同じ操作を実行すると、シェルは終了します。なぜ?同様sleep 100
にに置き換えると、sleep 100 & wait
シェルは終了しますkill
。
答え1
シェルは、特定のチェックポイント(コマンドの最後)でのみ未解決のトラップをチェックし、暗黙的に実行されているコマンドを待つ場合は、そのチェックポイントの直前にあります。
一方、この信号を使用しない場合は、trap .... TERM
プロセス(シェルも含む)を終了するデフォルトの動作として信号が使用されます。
を使用すると、trap .... TERM
SIGTERM に対する基本的な信号動作がなくなり、シェルがシャットダウンするのを防ぎます。