stdoutに関する有用な情報を生成するプログラムがあります stdinからも読み取ります 。標準入力に何も提供せずに、標準出力をファイルにリダイレクトしたいと思います。これまでのところ、とても良いです:私にできること:
program > output
ttyでは何もしません。
ただし、問題は、これをバックグラウンドで実行したいということです。私がそうする場合:
program > output &
プログラムは一時停止されます(「一時停止(tty入力)」)。
私がそうする場合:
program < /dev/null > output &
プログラムはEOFに達したため、すぐに終了します。
私が必要としているのは、programにパイプすることだと思われます 無期限に何もせず、stdinを読み取らないもの 。次のアプローチが機能します:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
しかし、これはすべて非常に醜いです。 あります 標準のUnixユーティリティを使用して、「無期限に何もしない」(man trueと言い換える)エレガントな方法である )。どうすればこれを達成できますか? (ここでのエレガンスの主な基準:一時ファイルなし、ビジーウェイトまたは定期的なウェイクアップなし、エキゾチックなユーティリティなし、可能な限り短い。)
承認された回答:
それらをサポートするシェル(ksh、zsh、bash4)では、programを開始できます。 共同プロセスとして。
-
ksh:program > output |& -
zsh、bash:coproc program > output
これでprogramが始まります pipeからリダイレクトされた入力でバックグラウンドで 。パイプのもう一方の端はシェルに向かって開いています。
そのアプローチの3つの利点
- 追加のプロセスはありません
programのときにスクリプトを終了できます 死ぬ(waitを使用 それを待つために)program終了します(eofを取得します シェルが終了した場合は、そのstdinに)