1

私が説明する動作は、現在 OS X で発生することが観察されています。

Bash スクリプトには、 などの文字列でparent-script.shあるコマンドeval $SCRIPTが含まれています。SCRIPT./another-script.sh

another-script.sh長時間実行されるスクリプトであり、実行中にシグナルを送信すると、実行中のサブシェルが終了せ、 の子になることがparent-script発生するように見えます ( を使用してチェックします) 。pstreeanother-scriptlaunchd

を起動した端末にまだバインドされている STDOUT がありますparent-script

この動作を変更するにはどうすればよいですか? また、この動作の本当の原因は何ですか? (いつこの動作が予想されるかを知ることができるように)

Linux タグがここにあるのは、Linux の動作が異なる場合にここでどのように動作するかを知りたいからです。

私はまた、おそらく非常に深いトピックの表面をなでていることに気づき始めています。したがって、優れた読み物へのリンクは大歓迎です。

4

2 に答える 2

1

スクリプトのペアを使用して、(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?) がシェルの動作を指示する方法であるかのどちらかです。

于 2013-07-07T03:35:07.217 に答える