2017-10-02 8 views
0

一行無限デタッチforループ:私はこのようなデタッチ何か実行することができ構文私はこのような無限ループの中で何か実行することができ

$ while true; do foo; done 

$ foo & 

をしかし、私は実行することはできません

$ while true; do foo & ; done 
-bash: syntax error near unexpected token `;' 

無限ループを1行のシェルコードで実行するにはどうすればいいですか?

答えて

0

&は、;のようなターミネータであるため、混在させることはできません。ただ、それ以外の場合はすぐにあなたのシステムをあふれよ、私はsomehwere sleep追加したい

while : ; do foo & done 

を使用しています。

0

あなたではなく、個々のfooコマンドよりも、バックグラウンドでループを実行したい場合は、カッコ内に全体を置くことができます。

(while true; do foo; done) & 
0

あなたは

  • をしたいかを明確にすべきバックグラウンドで実行されているfooの多くのコピーまたは
  • バックグラウンドwhileループ内で実行されているfooの単一コピー。

chorobaの答えは前者を行います。後者を行うには、サブシェルの構文を使用することができます

(while true; do foo; done) & 
0

すべての良い答えをすでにここ - ちょうど@ chorobaの補正を使用して元のループが正常に立て続けに生成されたプロセスの非常に厄介な無限の文字列を作ることに注意してください。

いくつかの便利なバリエーションがあります。このようにループ内に遅延を投げ込むことができます -

while true; do sleep 1 && date & done 

しかし、それによって生成されるプロセス間に遅延は発生しません。あなたはそれが産卵を停止する場合は1に必ずfooセットの指揮を行い、その後

echo 0 > cond # false 
delay=10  # secs 

その後、

until (($(<cond))) do; sleep $delay && foo & done 

または

while sleep $delay; do (($(<cond))) || foo & done 

:もっとこのような何かを考えてみましょう。

しかし、私はいわば、バックグラウンドで実行されているループのフォアグラウンドでfooを実行し、そして唯一のきれいfoo終了するまで再試行します

until foo; do sleep $delay; done & 

のような、より制御アプローチのために試してみました。

あなたは考えを得る。

関連する問題