1:

1:

私はシステムに問題がないかどうかを確認するために一連のスクリプトを実行するC ++監視デバイスを作成しました。

コードが少しトリッキーで、ここには表示されませんが、次のシステムコールに対応します。

int const r(system("/bin/sh /path/to/script/test-health"));

rステートメントにコマンドが欠落してスクリプトが失敗した場合にのみifゼロです。スクリプトに積極的な部分があります。

set -e
[...]
if unknown_command arg1 arg2
then
[...]

明らかにunknown_command失敗した理由は…不明。その時点で私が始めたので、スクリプトは終わりましたset -e

ただし、この場合、終了コードは0になります。

この場合、終了コード1を取得する方法はありますか?

つまり、問題は、バグが存在することを確認するためにテストを追加することなくバグを検出することですunknown_command。私はこれを行う方法を知っています。

if ! test -x unknown_command
then
    exit 1
fi

私のポイントは、スクリプトの作成時にunknown_command直接インストールするときにスクリプトがあると予想しましたが、問題が発生した場合、または誰かがすべてをインストールせずに他のシステムにスクリプトをコピーした場合は、スクリプトを実行するときに何が間違っているのかを知りたいということです。 。

ベストアンサー1

POSIX規格では、~についてset -e:

-e、または予約語の後の複合リスト、予約語で始まるパイプ、または最後のAND-ORリストを除くすべてのコマンドを実行するときは、この設定は無視する必要があります。whileuntilifelif!

これはif、ステートメント内で不明なコマンドを実行した場合いいえ実行中にスクリプトが終了しますset -e。あるいは、むしろset -eシャットダウンを引き起こさない。


ユーザーは、呼び出されるユーティリティのフルパスを使用しない限り、command -v現在のユーティリティが存在するかどうかをテストしますPATH。この場合、-x質問が示すようにテストで十分です。

また見なさい: 「which」を使わないのはなぜですか?それでは何を使うべきですか?

おすすめ記事