たとえば、私の質問を明確にする必要があります。この動作は私にとって意味があります。
$ 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
。