Shell-Script
顯示程序輸出的滑動視窗
我想執行一個命令 (
rsync -av
) 並且在任何時候只顯示 10 行輸出。我找到了類似的文章,但我不想將其重定向到文件。我希望同時顯示輸出,但最多只能看到 10 行。例如:輸出完成後有 100 行。一開始,它顯示第 1-10 行。然後 2-11 –> 3-12 –> 4-13 直到 91-100
我試過了:
rsync -av /source /destination | tail -f -n 10
是這樣的:
rsync -av /source /destination | while read i; do echo -en "\r$i"; done
但有 10 行而不是 1 行。
我在嵌入式 Linux 發行版的建構系統中做過這樣的技巧。在我的情況下,它有點不同。建構腳本限制了滾動區域(通過 VT100 轉義序列),因此日誌顯示在終端的頂部 N-4 行中。底部四行變成了一個靜態區域,隨著建構進度更新:目前正在建構的內容、進度百分比等。
實現您正在尋找的方法是:
- 將游標移動到終端的底行。
- 列印十個空白行以滾動掉任何現有材料。
- 將滾動區域設置為底部十行。
- 執行命令。
- 重置滾動區域。
轉義序列可以在許多參考資料中找到。
以下是我剛剛敲出來的東西。它適用於我在這裡的 Ubuntu VM 上的 bash。它依賴於
$(( ... ))
算術,並stty
支持-g
將 tty 設置保存在序列化字元串中。我避免使用\e
inprintf
來表示轉義字元,這會降低它的可移植性。我們從終端詢問行數,因為
LINES
變數可能不會被導出。(我們可以改為從 的輸出中解析出rows
參數stty -a
;然後我們可以避免將 tty 置於原始模式並使用 獲取終端仿真器的響應的整個過程dd
。另一方面,即使rows
來自tty 驅動程序不正確。)將此腳本另存為,例如
last10
,使其可執行,然後嘗試last10 find /etc
。#!/bin/bash # 保存 tty 設置 保存的stty = $(stty -g) 恢復() { stty $saved_stty # 重置滾動區域 printf "\033[1;${rows}r" # 移動到顯示底部 printf "\033[999;1H" } 陷阱恢復 int term 退出 # 移動到顯示底部 printf "\033[999;1H" printf "\n\n\n\n\n\n\n\n\n\n" # 查詢實際游標位置 printf "\033[6n" # 讀取 tty 響應 tty_response= stty raw isig -echo 雖然是真的;做 char=$(dd bs=1 count=1 2> /dev/null) 如果 [ "$char" = "R" ] ; 然後 休息; 是 tty_response="$tty_response$char" 完畢 stty $saved_stty # 解析 tty_response 獲取大小() { 列=$3 行=$2 } 保存_IFS=$IFS IFS='[;R' get_size $tty_response IFS=$save_IFS # 設置滾動區域為 10 行 printf "\033[$((rows-9));${rows}r" # 移動到顯示底部 printf "\033[999;1H" # 執行命令 “$@”