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に)