やはり、前回も書いた 「set -e」の線が一番怪しいと思います。
試しに、A_child.sh の perl 呼出の直前に「set +e」という 1行を挿入して実行してみてください。 perl が 0以外で exit しても trap されなければ、質問1 は一旦解決ですね。
問題は、その修正が新たなバグを作り込んでいないかどうかです。 そのソフトが、バグや故障に起因して誤動作すると人様に迷惑をかける様な性質のソフトであれば、そのまま完了にするのはとても危険です。
perl 呼出の直後に 「set -e」の 1行を入れるだけで良いかも知れませんが、緻密なシグナル設計がされたソフトなら全体をしっかり見た方が安全です。 perl スクリプトで予想外のエラーが起った時にどの様なエラー処理が適切かも含めて考えた方が良いと思います。
実は、「set +e」を使わない方法もあります。 exit は常に 0 として、A_child.sh に返す値は STDOUT を使用する方法です。 (perl スクリプトがすでに STDOUT を使用してるなら、STDERR に切り替える等して STDOUT を返値専用にしてくださいね)
この方法を使用するには、まず perl 中の 「exit 2;」とかを「print 2; exit 0;」とかに変更してください。
次に A_child.sh の perl 呼出の変更です。 perl 呼出が 「perl script.pl」、「perl directry/script.pl」、「directry/script/pl」、「script.pl」のいずれの形式であってもその全体を `(バック・シングル・クォート)で囲んで以下の様にしてください。
sts=`もとのPerl呼出`
こうすれば、perl が STDOUT に出力した内容は $sts という Shell変数で参照できます。 stsという変数名は、すでに使われてたら変えてください。
最後に質問2 ですが、プロセスの終了コードはあくまでも別物です。 しかし、今回の様に因果関係があって連動しているかの様に見える場合もあります。
bash は、自分の子プロセス(今回の場合 A_child.sh や perl)の異常終了(0 以外での exit)を検知して自らを終了させる機能があります。 その有効・無効を制御するのが「set -e」と「set +e」です。
bash に限らない一般論として、プロセスが終了する時には SIGTERM(だったかな?)というシグナルが発生します。 それを A_child.sh は trap で拾っているのでしょう。
「exit 1」は親プロセスにシグナルを発生させる遠因であって、シグナルそのものでは無いことがお解り頂けますね?
|