スクリプトから戻り値を取得するのに苦労しています。私に問題を引き起こしているスクリプトは_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
in _second.sh
_ killsの呼び出しです。ターミナルなので、_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でターミナルを強制終了しないリターンコードを追加するにはどうすればよいですか?
これまで、私はwithout最初のテストスクリプトを実行してきたので、2番目のスクリプトは成功/失敗を返す必要はありません。しかし、私はテストを自動化しようとしているので、本当にリターンコードを取得できる必要があります
おそらく理想的ではない方法の1つは、alias exit=return
を実行することです。これにより、second.sh
出口は、指定されたコードを使用して、代わりにスクリプトを返します。もちろん、これはexit
のように関数のネストを切り抜けることはありませんが、トップレベルのexit
呼び出しにはうまく機能するはずです。
最終的にはunalias exit
する必要があるかもしれません。
問題の結び目は、単にスクリプトを実行するのではなく(.
または./script2.sh
)、スクリプトを調達している(/bin/bash script2.sh
)ことです。
本当にsource
する必要がある場合は、サブシェル(. ./myscript2.sh args)
で行います。
通常スクリプトを実行できる場合は、$?
で実行するたびに自動的に更新される終了コードを変数に格納できます。
./myscript2.sh arg1
FirstExitCode=$?
./myscript2.sh arg2
SecondExitCode=$?
...
help .
でソースの詳細を読む
ソーシングに関するHasturの回答に基づくと、これは、ターミナルを強制終了せずにステータスを返すためにsecond.sh
で必要なもののようです。
#!/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