bash I / Oリダイレクト - stderrに追加する方法

bash I / Oリダイレクト - stderrに追加する方法

いくつかの大規模なデータセットを繰り返し、いくつかの長いタスクを実行するスクリプトがあります。その後、sort | uniq -c出力が必要です。それで、それが生きていることを知らせるために、N項目ごとにstderrにドットを印刷します(非常に原始的な擬似進行状況バー)。したがって、次のように見えます。

for i in {1..100}; do 
    [[ $(( (i+=1) % 10)) -eq 0 ]] && echo -n "." >&2
    shuf -i 1-10 -n1
    sleep 0.1
done | sort | uniq -c 

そして出力:

..........      9 1
     10 10
      8 2
     14 3
     13 4
      9 5
     11 6
      8 7
      8 8
     10 9

「進行状況バー」は出力を少し混乱させます。だから気になります。

  • フラッシュする前に、そのstderrにnwelineを追加する簡単な方法はありますか? (たぶんecho >&2それが私に必要なものかもしれません)
  • それとも削除しますか?

もちろん、実際にはWOWに多くの項目があることを知りません(少なくとも基本的には提供されていません)。それで、これがストリームリダイレクトを介して達成できるかどうか疑問に思います。

答え1

ループを中かっこ(または括弧)で囲み、その中に追加のエコーを入れます。

{ for i in {1..100}; do 
    [[ $(( (i+=1) % 10)) -eq 0 ]] && echo -n "." >&2
    shuf -i 1-10 -n1
    sleep 0.1
done; echo >&2; } | sort | uniq -c 

中括弧グループ全体にリダイレクトされたら、続行するsortには、ファイルの終わりを確認する前に、内部のすべてのエントリが終了するのを待つ必要があります。これにより、sortおよびの出力前に改行文字が印刷されますuniq

関連情報