• ベストアンサー

"パイプが切断されました"の表示を出したくない

自作シェルスクリプト | less とやったときlessを中断すると "パイプが切断されました"というエラーが発生します。 恐らく親プロセスの出力が完了する前にlessを終了した場合に発生するのだろうと考えているのですが、自作スクリプトを修正して、このエラーを出さないようにすることはできますか。 自作スクリプトは次のような繰り返し処理になっていて時間がかかるため、中断された場合を考慮した作りにしたいです。 find | while read FILE do 処理 done

質問者が選んだベストアンサー

  • ベストアンサー
  • Lean
  • ベストアンサー率72% (435/603)
回答No.3

>たとえば私の場合、次のシェルスクリプトの出力をlessに渡した直後にlessを終了すると、パイプ切断のエラーが発生します。 >#!/bin/sh >find / | while read FILE >do >echo $FILE >done CentOS 4.4で試したけど、broken pipeにはなりませんでした。

zyousuke
質問者

お礼

Leanさん、スクリプト試していただいて、ありがとうございます。 なんと、このエラーは私のリナックスでしか発生しないとは・・・ 私のリナックスは、いい加減もう古すぎるということなのでしょうね。 まあOSを入れ替えるかどうかは別として、 新しいOSにすれば、broken pipeも発生しなくなることですし、 このシェルスクリプト自体は何の問題もないということが分かったので満足です。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.2

メッセージが出る状況が再現できないので不確かですが、最初に、 trap exit 13 とパイプ切断シグナルをトラップすればどうでしょうか。

zyousuke
質問者

お礼

notnotさん、ご回答ありがとうございます。 パイプ切断シグナルなんてものが存在したのですね。 早速試してみたのですが、うまくいきませんでした。 exit以外のコマンドをtrapに記述して試してみたりもしたのですが、 どうも、パイプの切断をキャッチできていないような感じがします。 割り込みシグナルとかは、ちゃんとキャッチできるのです。 たとえば私の場合、次のシェルスクリプトの出力をlessに渡した直後にlessを終了すると、パイプ切断のエラーが発生します。 #!/bin/sh find / | while read FILE do echo $FILE done notnotさん、お暇なときに、このスクリプトでもう1回試してもらえないでしょうか。

すると、全ての回答が全文表示されます。
  • Lean
  • ベストアンサー率72% (435/603)
回答No.1

broken pipeは、プロセスがパイプに書き込みをしようとしたが、パイプから読み込みを行うプロセスがいない時に発生するので、lessを中断するとbroken pipeが発生する状況ならいくら自作シェルでどうこうしようとしてもbroken pipeの発生そのものを防ぐ事は無理なのでは? ところで何のために >自作シェルスクリプト | less というように実行しているのですか? 進行状況等を見るためにlessで止めて見ているなら、ファイルにリダイレクトして、ファイルを見ることで確認するようにすればいいだけでは?

zyousuke
質問者

お礼

Leanさん、ご返信ありがとうございます。 やはりシェルでどうこうしても無理なのですね。 無理なのであれば、それはそれで仕様と言い張れるので問題ないですねw ただ、なぜ私がシェルでどうにかできるかもしれないと思ったかというと、例えば find / | less とやった直後にlessを終了させた場合、エラーが発生しなかったからです。 だからfindにはパイプが切断されてもエラーにならないような仕組みが施されていると予想したのです。 しかし、今実験して気が付いたのですが findは私の自作スクリプトよりもはるかに高速だったのです。 lessを終了するよりも前にfindの出力が完了してしまうため、エラーが発生しなかったのだと思いました。 さて、Leanさんが疑問に思っている 自作シェルスクリプト | less を実行した理由ですが、 普通にテストするときはパイプなんて使わずにシェルスクリプト単体で実行するのですが、 単体で実行していたら頭の方で、気になる表示があって、でも、そのままどんどんスクロールしてしまったので 今度はlessを使って確認してみました。 ファイルに出力する方法も考えられたのですが、自作スクリプトはすごい時間がかかるので、手っ取り早くlessで確認してしまおうと思ったわけです。 あと私の場合、テストでファイルに出力して、消し忘れた場合、紛らわしいファイルがどんどん増えて何が何だか分からなくなってしまうんです~。 testとかtestaとかtestbとか、あやしいファイルがうじゃうじゃいます・・・。

すると、全ての回答が全文表示されます。

関連するQ&A