我將svn export
其用作應用程式打包程式腳本的一部分,看起來這個命令與許多其他命令一樣沒有任何類型的進度條。
我目前有兩個選擇:
- 在沒有選項的情況下使用它,並觀察它列印數千行
- 使用
--quiet
,並且在完成之前不會看到任何內容。
有沒有辦法至少即時顯示命令輸出的行數?例如:
Exporting SVN directory ... 1234 files
並且看到這個數字1234
即時增量?我可以想像將輸出通過管道傳輸到一個命令來執行此操作,但是哪個命令呢?
答案1
yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }
或將括號內的部分放入 shell 腳本中。請注意,只有當您的 shell 實際上支援預增量運算子(例如 bash、ksh93 或 zsh)時,這才有效。否則,您將必須遞增$I
然後列印它(如 中所示I=$((I+1));printf...
)。另外,如果printf
不是您的 shell 的內建函數(它是當前 bash 的內建函數),您可以使用echo -ne
或print -n
來代替以獲得更好的效能。您只想抑制換行符號並將 \r 解釋為轉義字元。
答案2
這是一個粗略的想法,但您可以使用該pv
命令來計算行數,並將其顯示在螢幕上。 pv
在它的許多開關中,有一個-l
開關可以對每條線路通過時進行計數。
例子
在這裡,我使用 while 迴圈來模擬 SVN 輸出中的一些檔案。
$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
3 0:00:05 [0.99/s ] [ <=>
它會繼續覆蓋輸出行,如下所示:
18 0:00:36 [ 0/s ] [ <=> ]
24 0:00:47 [0.991/s ] [ <=> ]
答案3
您可以在背景將命令作為作業運行,並將其 stdout(以及可選的 stderr)重定向到日誌檔案:command > logfile &
其中&
指定作業(如果也是 stderr,則用&>
代替>
)。
然後,您可以使用 wordcount 公用程式來計算日誌檔案中的行數wc -l
。
要在一個動態變化的行中顯示狀態的變化,您可以使用類似的東西while true; do echo -en '\r'; wc -l logfile; sleep 1; done
,但我不能強制 bash 繪製\r
回車符來殺死前一行的內容。
看這個問題,它幾乎是重複的:https://stackoverflow.com/questions/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash