[解決済み] シェルパイプでエラーコードをキャッチする
質問
現在、次のようなスクリプトを持っています。
./a | ./b | ./c
a,b,cのいずれかがエラーコードで終了した場合、エラーメッセージを表示し、悪い出力を前方にパイプする代わりに停止するように変更したいです。
そうするために最もシンプルでクリーンな方法は何でしょうか?
どのように解決するのですか?
最初のコマンドが成功したとわかるまで、2 番目のコマンドを実行させたくない場合は、おそらく一時ファイルを使用する必要があります。 そのシンプルなバージョンは
tmp=${TMPDIR:-/tmp}/mine.$$
if ./a > $tmp.1
then
if ./b <$tmp.1 >$tmp.2
then
if ./c <$tmp.2
then : OK
else echo "./c failed" 1>&2
fi
else echo "./b failed" 1>&2
fi
else echo "./a failed" 1>&2
fi
rm -f $tmp.[12]
1>&2' リダイレクトは '>&2' とも省略できますが、MKS シェルの古いバージョンでは、前の '1' がないとエラーリダイレクトを誤って処理するので、昔からこのあいまいでない表記を信頼性のために使ってきました。
これは何かを中断するとファイルが漏れる。 防爆型(多かれ少なかれ)シェルプログラミングの使い方。
tmp=${TMPDIR:-/tmp}/mine.$$
trap 'rm -f $tmp.[12]; exit 1' 0 1 2 3 13 15
...if statement as before...
rm -f $tmp.[12]
trap 0 1 2 3 13 15
最初のトラップ行は、「コマンドを実行する」と書かれています。
rm -f $tmp.[12]; exit 1
' のいずれかのシグナル 1 SIGHUP、2 SIGINT、3 SIGQUIT、13 SIGPIPE、または 15 SIGTERM が発生したとき、または 0 (シェルが何らかの理由で終了したとき) が発生したときです。
シェルスクリプトを書いている場合、最終的なトラップはシェル終了トラップである 0 のトラップのみを削除する必要があります (どのみちプロセスは終了しようとしているので、他のシグナルをそのままにしておくことができます)。
元のパイプラインでは、'a' が終了する前に 'c' が 'b' からデータを読み取ることは可能です。これは通常望ましいことです (たとえば、複数のコアに仕事をさせることになります)。 b'が'sort'フェーズである場合、これは適用されません - 'b'はその出力のいずれかを生成する前にそのすべての入力を見なければなりません。
どのコマンド(複数可)が失敗したかを検出したい場合、使用できます。
(./a || echo "./a exited with $?" 1>&2) |
(./b || echo "./b exited with $?" 1>&2) |
(./c || echo "./c exited with $?" 1>&2)
これはシンプルで対称的です。4分割やN分割のパイプラインに拡張するのは些細なことです。
set -e」による単純な実験では役に立ちませんでした。
関連
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] シェルで、「2>&1」はどういう意味ですか?
-
[解決済み] ディレクトリが存在しない場合のみmkdirする方法は?
-
[解決済み] LinuxのシェルスクリプトでYes/No/Cancelの入力を促すにはどうしたらいいですか?
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
-
[解決済み] シェルコマンドの実行と出力のキャプチャ
-
[解決済み] 標準出力ではなく標準エラー出力にパイプを通すにはどうしたらいいですか?
-
[解決済み] PHPで有用なエラーメッセージを得るにはどうしたらよいですか?
-
[解決済み] grep --includeオプションを複数のファイルタイプに使用するにはどうすればよいですか?
-
[解決済み] UNIXのsortコマンドは、どのようにして非常に大きなファイルをソートすることができるのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Bashスクリプトでエラーを発生させる
-
[解決済み] .bashrc、.bash_profile、.environmentの違いは何ですか?
-
[解決済み] ある処理の戻り値を否定するには?
-
[解決済み] 魚貝類でPATHを変更する【終了しました
-
[解決済み] サーバー上のjava jarファイルをバックグラウンドプロセスとして実行する
-
[解決済み] dockerコンテナ内でプロセスが実行されているかどうかを確認するには?
-
[解決済み] 行全体がマッチする場合のみ grep がマッチするようにするには?
-
[解決済み] Cygwinからファイルを開く
-
[解決済み] あるシェルスクリプトの関数を別のシェルスクリプトから呼び出すことはできますか?
-
[解決済み] バッチファイル - コマンドライン引数の数