web-dev-qa-db-ja.com

stdinの各行に対してコマンドをすぐに実行しますか?

stdinの各行に対してコマンドをすぐに実行するにはどうすればよいですか?

(echo abc; sleep 10; echo def;) | ???

xargsツールは、すべてのデータを確認するまで(stdoutが閉じるのを待つ)ブロックするため、ジョブを実行しません。それでも、新しい行が利用可能になったらすぐにコマンドを実行する必要があります。

3
VasyaNovikov

GNU Parallel:

(echo abc; sleep 10; echo def;sleep 10; echo def;)|parallel -uj1

-uは、出力をすぐに取得するために必要です。これがないと、コマンドは実行されますが、出力は後でのみ出力されます。

-j1単一のジョブスロットを強制的に実行します。除外すると、GNU並列読み取りn開始前のジョブになります。ここでn=コアの数です。

4
Ole Tange

@Hennesが提案するシェルスクリプトを使用します。

long_running_command | (
  while read -r LINE; do
    echo "line is: $LINE";
    command_to_execute "$LINE";
  done;
)

parallelとは対照的に、これには1行あたり約150ミリ秒+ 3..7ミリ秒のオーバーヘッドはありません。また、複数行のbashコマンドを実行したり、関数や変数を再利用したりする場合にも機能します。

3
VasyaNovikov