4

次のmakeを検討してください:

all: a b

a:
        echo a
        exit 1


b:
        echo b start
        sleep 1
        echo b end

実行中make -j2に次の出力を受け取ります。

echo a
echo b start
a
exit 1
b start
sleep 1
make: *** [a] Error 1
make: *** Waiting for unfinished jobs....
echo b end
b end

非常に大きな make ファイルがあり、実行の最後にエラー メッセージがないため、エラーを見落としがちです。

make 実行の最後にもエラー メッセージが表示されるようにする方法はありますか?

アップデート:

make 内から make の終了ステータスを確認する方法について、私の考えられる解決策を参照してください。

4

2 に答える 2

5

によって呼び出されたプログラムmakeがエラーを返した場合、 のリターン コードはmakeゼロにはなりません。したがって、呼び出した後make、戻りコードをチェックして、エラーが発生したかどうかを確認できます。(およびbashのような他の多くのシェルzsh) では、次のことができます。

# make
....
# echo $?

エコーは0、問題がなければ何かを出力し、そうでなければ他の何かを出力します。

シェル スクリプト内からチェックを実行することもできます。

make
if [ $? -eq 0 ]; then
    echo "Everything OK"
else
    echo "Something went wrong!"
fi

正確なエラー メッセージが必要な場合、最も簡単な方法は、出力makeを何らかのファイルにリダイレクトしgrep、実行が失敗した場合のエラーを確認することです。

しかし、私が通常これを行う方法は、並行して実行し、何か問題が発生makeした場合に再実行することです。これにより、クリーンなエラー メッセージが表示されます。-j1上記の手法を使用して、これをシェルスクリプトに入れることができると思います。

于 2012-06-11T03:45:31.580 に答える
0

ご覧のとおり、これらの両方のタスクの出力は独立しています。したがって、5 つのタスクを並行して実行していて、そのうちの 3 つがエラーになった場合、他のタスクの出力が散在している可能性があります。

最善の方法は、一連の一連の一連のタスクを一緒に実行し、それらのエラー出力をファイルに送信して、終了時に画面に出力することです。

PS - また、絶対にエラーがない限り、タスクで exit 1 を使用しないでください。

于 2012-06-10T19:26:18.663 に答える