web-dev-qa-db-ja.com

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

スクリプトから戻り値を取得するのに苦労しています。私に問題を引き起こしているスクリプトは_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番目のスクリプトは通常、ユーザーがスタンドアロンで実行します。プラットフォーム、アーキテクチャ、その他のさまざまな機能を検出するため、非常に複雑です。 CXXCXXFLAGSなどのさまざまな変数を設定します。 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
user56041

おそらく理想的ではない方法の1つは、alias exit=returnを実行することです。これにより、second.sh出口は、指定されたコードを使用して、代わりにスクリプトを返します。もちろん、これはexitのように関数のネストを切り抜けることはありませんが、トップレベルのexit呼び出しにはうまく機能するはずです。

最終的にはunalias exitする必要があるかもしれません。

2

問題の結び目は、単にスクリプトを実行するのではなく(.または./script2.sh)、スクリプトを調達している(/bin/bash script2.sh)ことです。

本当にsourceする必要がある場合は、サブシェル(. ./myscript2.sh args)で行います。

通常スクリプトを実行できる場合は、$?で実行するたびに自動的に更新される終了コードを変数に格納できます。

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

help .でソースの詳細を読む

1
Hastur

ソーシングに関する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
1
user56041