2017-12-13 13 views
1

他のコマンドを使用するbashスクリプトでは、$?を使用して前記コマンドのリターンコードを取得できることを理解しています。この方法では一般的にコマンドが0に成功したかどうかを知ることができますが、!0には失敗しましたが、コマンドには2つの終了コード10しかない場合の詳細が表示されません。バイナリリターンコードを持つコマンドのエラー処理を動的に処理する

例えば

私は、Linuxでreposyncコマンドを使用していた場合、私はそれが失敗した場合には、成功するコマンドを持っていると0を返すことが原因切断されたネットワークにそれが戻ってstdoutにもかかわらず、1を返します。以上のエラー:パッケージが削除された場合

[<reponame>: <repo_number> of <total_repos> ] Downloading <package> 
Could not retrieve package <package> Error was failure: getPackage/<package>: [Errno 256] No more mirrors to try. 

同様に、それはまた、(--gpgcheckフラグが使用されたと仮定して)失敗GPG署名検証に1を返します。

私の質問はbashスクリプトから、バイナリ終了コードのコマンドでエラー処理をどのように行うべきですか?

最初は私の考えは、それに応じて、エラーメッセージを処理するために、文字列にエラー出力をリダイレクトするために、次のようになります。

ERRORS=$(reposync 2>&1) 

は残念ながら、これは単にメッセージキャプチャし、私は任意の追加のエラー処理動作を行うことを許可するdoesntの報告のほかに。このエラーメッセージをグレープすることは本当にこのシナリオを処理する最もクリーンな方法でしょうか?あなたがパターンを使用できるようになる(bashを参照)

case "$ERRORS" in 
    *<string>*) 
    # Code for error that contains <string> 
    ;; 
    *<string2>*) 
    # Code for error that contains <string2> 
    ;; 
    *) 
    # None matched 
    ;; 
esac 

case命令

答えて

0

はあなたが変数ERRORSであなたのエラーテキストを持っていると仮定すると、あなたは、このような特定の単純な例を確認するためにcaseを使用することができます。たとえば、*はすべて一致します。 a|baまたはbなどと一致します。

これは、単純なチェックには十分かもしれません。

あなたが言及している例では、テキスト内のエラーコードをキャプチャしようとすると、[Errno 256]です。あなたはcase文で組み合わせることができる

echo $ERRORS | perl -n -e'/\[Errno\s*(\d+)\]/ && print $1' 

:そのために次のようなperlワンライナーを使用することができます。