我有一个脚本,可以循环处理一些大数据集合并执行一些冗长的操作。然后我需要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
。