Bash
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
就是我所需要的)- 或刪除它?
當然,在現實中,我不知道有很多東西(至少不是開箱即用的)。所以我想知道這是否可以通過一些流重定向來實現
將循環包裹在大括號(或括號)中,並將額外的 echo 放入其中:
{ 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
。