メインスクリプトは補助スクリプトを呼び出し、補助スクリプトはCプログラムを呼び出します。 Cプログラムの戻り値を取得する方法がわかりません。

メインスクリプトは補助スクリプトを呼び出し、補助スクリプトはCプログラムを呼び出します。 Cプログラムの戻り値を取得する方法がわかりません。

次の補助スクリプトを呼び出す基本スクリプトがあります。

 bash -ex $SOME_DIR/some_tester.sh

その後、ヘルパースクリプトは次のようにCプログラムを呼び出します。

./some_tester_in_C
echo $?
.
.
.other functions called

問題は、まずCプログラムから戻り値を取得できないことです。 2番目の問題は、私のCプログラムの終了後に何も実行されず、「他の機能」も実行されないことです。

重要な事実は、Cプログラムがシリアルポートと対話し、コンテンツを端末に印刷することです。外部デバイスとの通信が完了したら、続行するにはヘルパースクリプトでキャプチャする必要がある値が返されます。

ところで、メインスクリプトを使わずに端末からヘルパースクリプトを直接呼び出すと、うまく動作し、Cプログラムから戻り値を受け取り、残りのコードが実行されます。

別のスクリプトを呼び出した後、単純なCプログラムを呼び出す簡単なスクリプトを書いて問題を再現してみましたが、問題が再現されました。

set +xあちこちでそれが問題かもしれないと思う人たちを見ましたが、私はそうは思いません。たぶん$?別のものでなければならないと思いましたか?しかし、私はLinuxスクリプトに精通していません。いくつかの洞察力が役立ちます。

答え1

実行ヘルパースクリプトを使用しているので、スクリプトでシェルオプションを設定bash -eします。errexit単純なコマンド(Cコマンドなど)がゼロ以外の終了状態で終了した場合、このシェルオプションを使用するとスクリプトが終了します。

C プログラムの終了ステータスをキャプチャするには、次の点を確認してください。いいえヘルパースクリプトを起動したり、AND / ORリストの一部としてプログラムを実行したりするときに使用します。これにより、-e設定され、プログラムがゼロ以外の終了状態で終了してもスクリプトが終了するのを防ぎます。errexit

status=0
./some_tester_in_C || status=$?

printf 'Exit status = %s\n' "$status"

関連情報