スクリプトから戻り値を取得する際に問題があります。私に問題を引き起こすスクリプトは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