あなたがここでやっていることを含めている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"
exit関数内でも呼び出される場合、私は面倒でない方法はないと思います。面倒な方法は、終了トラップを設定してコードをそこに配置することです。
#!/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
               
              
.では、現在のシェルの別のファイルを読み込むコマンドを使用しています。関連する子シェルまたはサブシェルはありません。あなたがするもしかして実行second.shし、third.shそれらを調達するのではなく?