2017-04-05 3 views
0

私はたくさんのコード行を持つbashスクリプトを持っており、$を返す間に実行する必要がありますか? == 0、しかし、それがエラーを持っている場合は、それを停止し、コード1で終了する必要がありますか?コード0を返している間にbashスクリプトを実行するには?

質問はどのように行うのですか?

私は set -eコマンドを使用しようとしましたが、失敗したとして、ジェンキンスは、マークが

は私も

Iを記録し、私のジェンキンスでそれを示すために、エラーメッセージを取得する必要があり、それが成功のように見える彼のために、ビルドされません。エラーコードを取得することができました(私の場合は126となります)が、エラーメッセージを受け取る方法は?

#!/bin/sh 
while fileWithError.sh; do 
    sleep 1; 
done 
echo fileWithError.sh failed!! >&2 

注:

main file 
fileWithError.sh 
rc=$?; if [[ $rc != 0 ]]; then 

echo "exit {$rc} "; 
fi 

fileWithError.sh 
#!/bin/sh 
set -e 
echo "Test" 
agjfsjgfshgd 
echo "Test2" 
echo "Test3" 
+2

あなたの質問は不明です。スクリプト自体が多くのコード行であるか、それとも「長い」時間実行されているので、「長い」のですか?コマンドが失敗した場合はゼロ以外のステータスで終了しますか、それとも連続ループで実行したいのですか?スクリプトの呼び出しに失敗した場合にのみ中断しますか? 「それに間違いがあります」とはどういう意味ですか?予期しない入力に遭遇したことを意味しますか?または、それが呼び出すコマンドの1つがゼロ以外のステータスで終了することはありますか?それとも、予想される範囲外の出力を生成するのでしょうか?質問を明確にする。 –

+0

私は質問 – nightmare

+0

を更新しましたあなたはまだ多くの明確な質問に答えていません。 'set -e'はエラーで失敗するはずなので、スクリプトを呼び出すコードが間違っているように聞こえます。 – tripleee

答えて

1

ちょうどこれは、この

#!/bin/sh 

set -e 

#...Your code... 
+0

私は#!/ bin/bashを使って同じことを試みましたが、スクリプトを停止しますが、成功のようなJenkinsビルドのビルド – nightmare

+0

実際のスクリプトが失敗した場合、Jenkinsがエラーとして扱うスクリプトでラップしようとします。 '' '#!/ bin/sh bash実際のスクリプト.sh e = $? if [$ e -ne 0];その後、 エコー "エラーコード$ eでFAILED" エラーのように見える #doのSTHジェンキンスにエラー の出口と #.... #exitは2 Fiの '' ' – mkg20001

+0

はあなたがgoo.glで見ることができます/ WrgV4fここに私は小さなプロジェクトがあります – nightmare

1

に似たものになるはず

ファイルの先頭にコマンドset -eを追加し、私はあなただけしたいと思いますスクリプトがうまく書かれていれば、エコーは redunですfileWithError.shは、まともな エラーメッセージを既に書き込んでいるはずです。また、スリープは必要ないかもしれませんが、スクリプトがすばやく成功した場合に高速ループを防ぐのに便利です。

あなたは明示的な戻り値を取得することができますが、それはリファクタリングのビットを必要とします。しばらくスクリプトの戻り値が第1の構成では、睡眠の 戻り値になりますので、

#!/bin/sh 
true 
while test $? = 0; do fileWithError.sh; done 
echo fileWithError.sh failed with status $?!! >&2 

0

のみのエラーコードを取得するために、その非常に簡単ではありません。 これはどのように...

#!/bin/bash 
Msg=$(fileWithError.sh 2>&1) # redirect all error messages to stdout 
if [ "$?" -ne 0 ] # Not Equal 
then 
    echo "$Msg" 
    exit 1 
fi 
exit 0 

あなたはfileWithError.shによって作成されたすべてのメッセージをキャッチし、プログラムの開発は、エラーコードを返した場合、あなたはすでに変数に保存されたエラーメッセージを持っています。

しかし、エラーが表示されるまでの一時的なストアのすべてのメッセージがfileWithError.shによって作成されますので、これは、欠点を行います。

あなたはecho "$Msg" |tail -n 1と、エラーメッセージをフィルタリングすることができますが、そのことは100%で保存します。

またtrap "exit 1" ERRfileWithError.sh ...
スイッチset -eでいくつかの変更を行う必要があります。これはエラー時にスクリプトを閉じます。

希望すると、これが役立ちます。

関連する問題