出力をティーに配管するときのパイプ障害(141) - なぜですか?

出力をティーに配管するときのパイプ障害(141) - なぜですか?

たとえば、私の質問を明確にする必要があります。この動作は私にとって意味があります。

$ echo hi | cat
hi
$ echo hi | tee >(cat)
hi
hi

最初のケースは明らかです。 2番目のケースでは、コマンド置換を使用して「hi」をteeにパイプします。一方の「hi」はtee「d」で印刷され、もう一方の「hi」は「cat配送パイプ」で印刷されます。teeこれまではそんなに良くなった…

しかし、この場合、最初の「hi」はどうなりますか?

$ echo hi | tee >(echo yo)
yo

戻りコードは141で、パイプラインが失敗しました。原因は何ですか?

私は基本的な端末アプリケーションでMac OSX El Capitain、bashを実行しています。

ベストアンサー1

私はあなたの経験を他の人が再現できるものに調整する方法を見つけたと思います。

$(エコハロー;スリップ1;エコワールド)Tシャツ>(猫)
こんにちは
こんにちは                                                       ...そしてしばらくして、
世界
世界

$エコ「$?」
0

$(エコハロー;スリップ1;エコワールド)Tシャツ>(エコヨ)|
エヤディヤ
こんにちは

$エコ「$?」
141

理解できるように、実行中のプロセスのパイプを作成します。>(command)command。標準入力はcommandコマンドライン(この場合)の他のコマンドは、開いて書き込むことができるteeパス名に接続します。いつcommandはいcat、プロセスはそこに座ってEOFを取得するまでstdinから読み込みます。この場合、tee標準入力から読み取られたすべてのデータは問題なくパイプに書き込まれます。

しかし、時commandはいecho yo、プロセスはyo標準出力に書き込まれ、すぐに終了します。これにより問題が発生しますtee。もう一方の端にプロセスがないパイプに書き込むと、SIGPIPE シグナルを受け取ります。

明らかに、OS Xバージョンはtee 最初にコマンドラインにファイルを書き込み、次に標準出力にファイルを書き込みます。したがって、あなたの例(echo hi | tee >(echo yo))では、teeパイプは最初の書き込みで失敗します。ただし、Linux および Cygwin のバージョンはtee標準出力に書き込みます。最初hiだから、死ぬ前に画面に書き込むことができます。私の拡張例では、パイプteeに書き込むときにhello死んで読んで書く機会はありませんworld

おすすめ記事