発信者の端末を終了せずに終了コードを返しますか?

発信者の端末を終了せずに終了コードを返しますか?

スクリプトから戻り値を取得する際に問題があります。私に問題を引き起こすスクリプトはsecond.sh次のような。しかし、次のスクリプトとの対話があります。first.shそして、この相互作用が問題の原因であるようです。

最初のスクリプトはテストスクリプトで、2番目のスクリプトを駆動します。クロスコンパイル環境を設定するには、2番目のスクリプトが必要です(したがって主なポイントの理由)。その後、最初のスクリプト呼び出しmakeなど様々な変数が設定されます。CXXそしてCXXFLAGS

# first.sh

. ./second.sh arg1
if [ "$?" -eq "0" ]; then
    make
    ...
fi

. ./second.sh arg2
if [ "$?" -eq "0" ]; then
    make
    ...
fi

. ./second.sh arg3
if [ "$?" -eq "0" ]; then
    make
    ...
fi

2番目のスクリプトは通常、ユーザーが独立して実行し、プラットフォーム、アーキテクチャ、その他の機能を検出するため、非常に複雑です。など、さまざまな変数を設定します。CXXそしてCXXFLAGS使用されましたmake最初のスクリプトで。

# second.sh
...

# if success, return 0
exit 0
...

# if failure, return non-0
exit 1

私が経験している問題は電話することです。exit存在するsecond.shターミナルを殺すfirst.shその軌道で完全に止まった。ユーザーが単独で実行しても同様の問題が発生します。

2番目のスクリプトを次のように変更しようとすると:

# second.sh
...

# if success, return 0
return 0

# else for failure, return non-0
return 1

それからfirst.shより、second.shいつも失敗してもreturn 0

ターミナルを終了していないBashの下に戻りコードを追加するにはどうすればよいですか?


これまで私は走ってきました。いいえ最初はスクリプトをテストするため、2番目のスクリプトは成功/失敗を返す必要はありません。ただし、テストを自動化したいので、戻りコードを取得できるはずです。

答え1

理想的ではないかもしれない1つのアプローチはdoですalias exit=return。これにより、second.sh終了 do スクリプトが指定されたコードとともに返されます。これは間違いなくこのような関数のネストをブロックしませんが、exitトップexitレベルの呼び出しでは機能します。

結局、これを行う必要があるかもしれませんunalias exit

答え2

問題の鍵は、単にスクリプトを実行すること(または).ではなくスクリプトを取得することです()。./script2.sh/bin/bash script2.sh

必要に応じてsourceサブシェルで実行してください。(. ./myscript2.sh args)

実行できれば通常スクリプトを変数に保存でき、終了コードは各実行後に自動的に更新されます$?

./myscript2.sh arg1
FirstExitCode=$?
./myscript2.sh arg2
SecondExitCode=$?
 ...

ソースの詳細help .

答え3

second.shソーシングへのHastaの答えによると、端末を終了せずに状態を返すために必要なようです。

#!/usr/bin/env bash
...

# if success, return 0
[ "$0" = "$BASH_SOURCE" ] && exit 0 || return 0

# else for failure, return non-0
[ "$0" = "$BASH_SOURCE" ] && exit 1 || return 1

関連情報