Bash

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

  • June 14, 2021

我有一個腳本可以遍歷一些大數據集合併執行一些冗長的操作。然後我需要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

引用自:https://unix.stackexchange.com/questions/654227