GNU/Linux >> Linux の 問題 >  >> Linux

Bash +セカンダリスクリプトとメインスクリプトの両方を終了する方法は?

スクリプト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内のすべてのプロセスを強制終了します 非対話型シェルから開始した場合、通常は親が含まれます。

関連:いくつかのバックグラウンドプロセスの時間を計る方法は?
Linux
  1. Bashスクリプトをデバッグする方法は?

  2. .bashrcの目的とそれはどのように機能しますか?

  3. フォルダから最も古いファイルを削除するためのBashスクリプト?

  1. ターミナルでループバッシュスクリプトを停止する方法は?

  2. スクリプトから正しい終了コードを取得できませんか?

  3. BashスクリプトからTmuxセッションに参加しているかどうかを確認するにはどうすればよいですか?

  1. Ubuntuのコマンドラインから日付と時刻を同期する方法

  2. 前回の実行時の値を保持する Bash スクリプトの変数

  3. フォルダーから最も古いファイルを削除する Bash スクリプト