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

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

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

答え2

2番目と3番目のシェルを取得する必要はなく、他のコマンドのように実行するだけです。必要に応じて、終了コードを次のように保存して使用できます。

#! /bin/ksh
echo "prova"

# execute and capture stdout ... output of second is not seen ...
OUTPUT1=$(./second.sh)

# find out exit status of second.sh
STATUS1=$?

# ... until now
echo $OUTPUT1

# do something based on the result
if [ $STATUS1 -eq 0 ]; then 
  echo "second.sh ran successfully"
else 
  echo "second.sh crapped out"
fi

# and so on...

答え3

次のことを試してみてください(.電話をかけるときは最初に削除してくださいsecond.sh)。

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 $?

これは.、短縮コードによって、source2番目のスクリプトが最初のスクリプトの一部として含まれるためです。

答え4

script1.sh

  1 PWD="/scratch/currdir"
  2 echo "Hello from scrpt 1"
  3
  4 sh $PWD/script2.sh # We will exit in script2.sh and see if line 6 gets printed
  5
  6 echo "From script 1: After scrpt2 call"
  7 exit 0

script2.sh

  1 echo "Hello from script 2"
  2
  3 exit 1
  4 echo "This should not get printed"

出力:

-bash-4.1$ sh script1.sh
Hello from scrpt 1
Hello from script 2
From script 1: After scrpt2 call

(注:script2(行3、終了1)を終了しましたが、まだscript1.shにあります。行6はscript2.shを呼び出した後に実行されます。

お役に立てば幸いです。

関連情報