スクリプトのペアを使用して、(Mac OS X 10.8.4で)観察したことをエミュレートしようとしました:
親スクリプト.sh
SCRIPT=./another-script.sh
trap "echo Exiting; exit 1" 0 1 2 3 13 15
eval $SCRIPT
trap 0
echo "Normal exit"
別のスクリプト.sh
for i in $(seq 1 100)
do echo "Sequence $i"; sleep 2; done
実行すると、たとえば次のようになりました。
$ ./parent-script.sh
Sequence 1
Sequence 2
Sequence 3
Sequence 4
^CExiting
Exiting
$
私がこのように変更したときanother-script.sh
:
trap '' 1 2 3 13 15
for i in $(seq 1 100)
do echo "Sequence $i"; sleep 2; done
私は(異常な?)動作をしました:
$ ./parent-script.sh
Sequence 1
Sequence 2
Sequence 3
Sequence 4
^CSequence 5
Sequence 6
^CSequence 7
^CSequence 8
Sequence 9
^CSequence 10
^CSequence 11
^\Sequence 12
Sequence 13
Sequence 14
Sequence 15
Sequence 16
Sequence 17
Sequence 18
Sequence 19
Sequence 20
./parent-script.sh: line 3: 71135 Abort trap: 6 ./another-script.sh
Exiting
Exiting
$
別のターミナル ウィンドウを作成し、送信kill -6 71135
して親プロセスを停止する必要がありましたが、これは完全に間違っていると思います。親プロセスに割り込みを送信しました。私がそうすると、すぐに(トラップを介して)終了するはずです。子プロセスを実行したままにする必要があります。割り込みから絶縁されています。私は以前、この行動に腹を立てていました。eval
効果を得るために必要ではありません。それなしでスクリプトを実行するだけで十分です。
ただし、ksh
同じように動作しました。したがって、Apple が両方のシェルに同じバグを導入するように注意を払っているか、それが誰か (POSIX?) がシェルの動作を指示する方法であるかのどちらかです。