2017-02-16 8 views
1

出力を常に出力するコマンドを実行しています。私はコマンドが失敗した場合にのみ出力を見たいと思います。成功時の出力を抑制するパイプコマンド

このような何か: % (echo OK; true) | FILTER % (echo ERROR; false) | FILTER ERROR

FILTER標準のシェルツールを使用して実装することができますか? 構造は必ずしもパイプである必要はありません。 FILTER "my_command"のようなものはOKです。

P.S.実際のプログラムは単体テストで、Googleテストスイートを使用して実装されています。それは常に非常に冗長であり、成功の場合、出力は興味深いものではありません。あなたは以下を参照することができますよう

+0

サブシェルは常に存在しますか? '()'またはここに示した例だけですか? – Inian

+0

'a = $(エコーOK;真)|| echo "$ a" '; 'a = $(echo ERROR; false)|| echo "$ a" '; – anishsane

+0

@Inian、no - サブシェルは単なる試みであり、明確な例を書いています。 – ugoren

答えて

2

あなたDONTは、あなたのケースでコマンドセット(「;」で区切られたコマンドのリスト)の終了コードをサブシェルを必要とし、最後の終了コードですコマンドを使用します。あなたの例の最後にはtrueまたはfalseしかありません。問題の前のコマンドはありません。これを行うには

最良の方法は、コマンド置換($())を使用して、変数への出力をキャプチャして、唯一のリターンコード場合は、後続のコマンドを実行し、内蔵||オペレータのシェルを使用することです前のコマンドの失敗は失敗です。

var=$(echo ERROR); false || printf "%s\n" "$var" 
ERROR 

var=$(echo ERROR); true || printf "%s\n" "$var" 

上記条項の逆は何manページがCOMMAND LISTS

用について言いたいことがあるANDとORリストの方がパイプラインの1の配列である

var=$(echo ERROR); true && printf "%s\n" "$var" 
ERROR 

var=$(echo ERROR); false && printf "%s\n" "$var" 

を参照してくださいされるだろう&&||の制御演算子で区切られています。 ANDおよびORのリストは、左連想で実行されます。 Anとリストは

command1 && command2 

Command2をは、唯一ゼロの終了ステータスを返しCommand1を、もしあれば実行される形態を有します。 ORリストの形式を有する

command1 || command2 

Command2をが実行された場合にのみ、非ゼロの終了ステータスを返しのCommand1。 ANDおよびORリストの戻り状態は、リスト内で最後に実行されたコマンドの終了状態です。

+1

シェル変数に未知の量のデータを保存するのは難しいようですが、それはうまく動作し、' printf'は改行(unline 'echo')をうまく扱います。 – ugoren

+0

'(echo OK; true)'の使用は単なる例であり、実際には実行可能ファイルなので、最初の部分だけを取り込むことはできません。しかし、それを修正するのは簡単です。var = $(echo OK; true)&& printf "%s \ n" "$ var" 'は同じです – ugoren

3

あなたがこれでは/ dev/nullに標準出力をリダイレクトすることができます:

command 1>/dev/null 

この方法では、エラーメッセージだけが表示されます。

+0

これは私が求めているものではありません。成功した場合はすべての出力を抑止し、エラーの場合はすべての出力を表示したい。 – ugoren

関連する問題