他のスクリプトのスクリプトを呼び出しますが、サブスクリプトが終了を呼び出す場合は、親スクリプトを終了しないでください。

他のスクリプトのスクリプトを呼び出しますが、サブスクリプトが終了を呼び出す場合は、親スクリプトを終了しないでください。

first.sh:

#! /bin/ksh
echo "prova"
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
echo "ho lanciato il terzo"

second.sh:

echo "sono nel secondo script"
dosomething1
exit $?

second.shエラーが検出されると、first.sh常に終了し、-9状態で終了します。サブシェルが終了したときに最初のシェルで終了するのを防ぐ方法は?

編集できませんsecond.sh

ベストアンサー1

ここで行うことは、second.shシェルthird.shプログラミングで「ソース」と呼ばれる同じプロセスで実行される添え字で処理することです。デフォルトでは、当時のテキストを. ./second.sh含むものと同じです。second.shこのexitコマンドはプロセスを終了し、ソーススクリプトから呼び出すかソーススクリプトから呼び出すかは関係ありません。

でのみコマンドを実行し、元のスクリプトの変数と関数にアクセスまたは変更する必要がない場合は、second.shそのthird.shスクリプトを子プロセスとして呼び出します。

#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"

元のスクリプトの変数と関数を変更せずにアクセスするために別のスクリプトが必要な場合は、サブシェルからそのスクリプトを呼び出します。サブシェルは別のプロセスなので、exit終了するだけです。

#! /bin/ksh
echo "prova"
(. ./second.sh)
echo "ho lanciato il secondo"
(. ./third.sh)
echo "ho lanciato il terzo"

親スクリプトで定義されている変数または関数を使用する必要がある場合は、引き続きインポートする必要がありsecond.shますthird.sh

組み込み関数は、プロセス全体ではなくソーススクリプトのみを終了します。これは、コマンドに他のスクリプトを含めることと親スクリプトにそのテキストを含めることのreturnいくつかの違いの1つです。.ソーススクリプトがexit内部機能ではなく最上位レベルでのみ呼び出される場合は、スクリプトを変更せずにエイリアスを使用してexitこれをreturn実行できます。

#! /bin/ksh
echo "prova"
alias exit=return
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
unalias exit
echo "ho lanciato il terzo"

if をexit内部関数ともいうが、問題なくできる方法はないようです。面倒なアプローチの1つは、終了トラップを設定し、そこにコードを入れることです。

#!/bin/ksh
do_first () {
  echo "prova"
  trap "after_second" EXIT
  . ./second.sh
  after_second
}
after_second () {
  echo "ho lanciato il secondo"
  trap "after_third" EXIT
  . ./third.sh
  after_third
}
after_third () {
  trap - EXIT
  echo "ho lanciato il terzo"
}
do_first

おすすめ記事