スクリプトscript1
を実行します スクリプトからscript_main
script_main
:
#!/bin/bash
/tmp/script1
echo $?
sleep 2
echo script ended
script1
:
#!/bin/bash
exit 1
明らかなように、script1
終了コード1で終了しますが、メインスクリプトは終了するまで続行されます。
私の質問:script1
の場合、それは可能ですか? exit 1
、次にmain_script
すぐに停止しますか?
承認された回答:
最も簡単な方法は、最初のスクリプトを明示的にexit
にすることです。 他のスクリプトが失敗した場合。
otherscript.sh || exit 1
または
if ! otherscript.sh ; then
ret=$?
echo "otherscript failed with exit code $ret. exit." >&2
exit 1
fi
これにより、メインスクリプトで必要なクリーンアップを実行したり、子の終了コードに応じて他の解決策を試したりすることができます。最初のものでは、|| exit
、子の終了コードを渡すため。
いずれかのときにメインスクリプトを終了させたい場合 起動するコマンドが失敗し、set -e
。
set -e
otherscript.sh
echo "this will not run if otherscript fails"
set -e
条件付き構造内で実行されるプログラムには適用されないため、特定のコードをテストしたり、|| true
失敗を無視します。しかし、現在どこにでも終了ポイントがあるので、trap somecmd EXIT
を使用できます。 どこで発生したかに関係なく、シェルが終了する前にクリーンアップを実行します。
内部スクリプトでメインスクリプトを強制的に終了させることも可能ですが、少し不親切で、通常のアプリケーションで終了することは期待できません。ただし、必要に応じて、内部スクリプトにその親プロセスを単純に古いものとして実行させることは1つの方法です。
$ cat mainscript.sh
#!/bin/bash
./otherscript.sh
echo "$0 exiting normally"
$ cat otherscript.sh
#!/bin/bash
echo "$0 kill $PPID"
kill $PPID
$ bash mainscript.sh
./otherscript.sh kill 11825
Terminated
ここで、otherscript.sh
を実行すると インタラクティブシェルから、インタラクティブセッションを撮影しようとします。私がテストしたすべてのシェルは、SIGTERM
を無視しているようです ただし、この場合、インタラクティブに実行する場合。いずれにせよ、メインシェルは再びtrap
SIGTERM
。
親プロセスだけを撮影する代わりに、kill 0
を使用できます。 プロセスグループotherscript.sh
内のすべてのプロセスを強制終了します 非対話型シェルから開始した場合、通常は親が含まれます。