bash I/O 重定向 - 如何附加到 stderr

bash I/O 重定向 - 如何附加到 stderr

我有一个脚本,可以循环处理一些大数据集合并执行一些冗长的操作。然后我需要sort | uniq -c它的输出。因此,为了让它知道它还活着,我在 stderr 上每 N 个项目打印一个点(非常原始的伪进度条),所以它看起来很像这样:

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

“进度条”使输出有点混乱 - 所以我想知道:

  • 在刷新该标准输出之前,有没有一种简单的方法可以在该标准错误中添加一个nweline? (可能echo >&2就是我所需要的)
  • 或删除它?

当然,在现实中我不知道哇有很多物品(至少不是开箱即用的)。所以我想知道这是否可以通过一些流重定向来实现

答案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

相关内容