bashプロセス置換を使用して、ファイルに対して2つの異なるコマンドを同時に実行したいとします。この例では、必ずしも必要ではありませんが、 "cat/usr/share/dict/words"は50GBのファイルを解凍するなどの非常に高価な操作でした。bashプロセスの置換とテールの結果が正しくありませんか?
cat /usr/share/dict/words | tee >(head -1 > h.txt) >(tail -1 > t.txt) > /dev/null
このコマンドの後、私はh.txtは、「A」を提出し、t.txtファイルの最後の行「Zyzzogeton」を含むように単語の最初の行が含まれていることを期待します。
しかし実際には、h.txtには "A"が含まれていますが、t.txtには "argillaceo"が含まれており、ファイルには約5%含まれています。
どうしてですか? 「テール」プロセスが早期に終了しているか、ストリームが混ざっているようです。 z.txtはすべてが含まれている間、私はA.TXTが「A」で始まるすべての単語を含むことを期待したい。このコマンドの後
cat /usr/share/dict/words | tee >(grep ^a > a.txt) >(grep ^z > z.txt) > /dev/null
:このような他の同様のコマンドを実行
は期待通りに動作します「z」で始まる言葉は、まさに起こったことです。
これはなぜ "tail"で動作しないのですか?これ以外のコマンドではうまくいきませんか?
:
別のハックのオプションは、それが非ゼロの長さになるまで
head
プロセスリストの仕上げをさせて開始する前にt.txt
をゼロにすることです/ questions/4489139/bash-process-substitution-and-syncingは、外部コマンドが終了すると直ちに置換プロセスが終了することを示唆していますが、率直に言って、これは現在の問題です。 –