2013-07-19 4 views
11

bashのpipefailに対応するダッシュシェルに類似のオプションがありますか?ダッシュシェルのpipefailに相当する

パイプ内のいずれかのコマンドが失敗した場合(ただし、-eを実行すると終了しない場合)は、ゼロ以外のステータスを取得する方法です。それをより明確にするために

が、ここで私が達成したいものの一例である:

サンプルデバッグメイクファイルでは、私のルールは次のようになります。

set -o pipefail; gcc -Wall $$f.c -o $$f 2>&1 | tee err; if [ $$? -ne 0 ]; then vim -o $$f.c err; ./$$f; fi; 

基本的には実行され、エラーファイルを開きますエラーが発生した場合はソースファイルを読み込み、エラーがなければプログラムを実行します。いくつかの入力を省く。上記のスニペットはbashでうまくいきますが、私の新しいUbuntyシステムではダッシュが使用されていますが、これはpipefailオプションをサポートしていないようです。

コマンドの以下のグループの最初の部分が失敗した場合、私は基本的にFAILUREのステータスが欲しい:

gcc -Wall $$f.c -o $$f 2>&1 | tee err 

私はIF文のためにそれを使用できるようにします。

これを達成する別の方法はありますか?

ありがとうございます!

+1

にありますか? 'もしgcc -Wall $$ f.c -o $$ f> $$ f.log 2>&1; cat $$ f.log; ./$$f;それ以外の場合はvim -o $$ f.c $$ f.log; fi'(または、Ubuntyに 'bash'をインストールしてください。これは逃げ出しただけです) – rici

+0

@riciありがとう!私はtederを使用していました。なぜなら、stderrの出力を画面に出力したかったからです。主に警告があったかどうかを確認するためでした。しかし、他の方法がない場合は、おそらくあなたが提案したものに切り替えるでしょう。 bashのインストールについて:私はダッシュがbashから一歩前進していると仮定していましたので、私は戻ってきたくはありませんでしたが、ちょっと調べてみると必ずしもそうではないようです。違いについてもう少し読んで、次に決定します。両方のあなたの指針をもう一度ありがとう! – Lavya

+1

私は上記のset -eがset -o pipefailのダッシュに相当するが、そうではないことを期待していました。 '$ dash -c 'set -e;偽|ネコ';エコー$? $ ' –

答えて

6

PIPESTATUS/pipefailのPOSIX実装のための「ストック」の答えは、ちょうど `tee`を取り除くないのはなぜcomp.unix.shell FAQ Q11

+3

これは質問に答えません。このドキュメントでは、パイプコマンドの終了コードを別々の変数に入れる方法について説明します。しかし、これは手近な質問からはかなり離れており、パイプコマンドが失敗するとすぐにシェルが自動的に終了するようにしています。 「RTFM」は、「FM」が実際に質問に答えた場合にのみ有効です。 – vog