GNU/Linux >> Linux の 問題 >  >> Linux

エレガントな方法で永遠に何もしない方法は?

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を開始できます。 共同プロセスとして。

  • kshprogram > output |&
  • zshbashcoproc program > output

これでprogramが始まります pipeからリダイレクトされた入力でバックグラウンドで 。パイプのもう一方の端はシェルに向かって開いています。

そのアプローチの3つの利点

  • 追加のプロセスはありません
  • programのときにスクリプトを終了できます 死ぬ(waitを使用 それを待つために)
  • program 終了します(eofを取得します シェルが終了した場合は、そのstdinに)

Linux
  1. tcpdump:grep可能な出力を取得するには?

  2. この出力をソートする方法 1,10,11..2

  3. ヘッダーを使用して ps 出力を grep する方法

  1. Du出力をサイズで並べ替える方法は?

  2. プログラムの出力をZipファイルにリダイレクトする方法は??

  3. ping の出力を止めるには?

  1. プログラムは、カラー出力を使用するかどうかをどのように決定しますか?

  2. 標準出力を閉じる(>&-)?

  3. リダイレクションの使い方を覚える方法は?