Shell-Script

顯示程序輸出的滑動視窗

  • January 29, 2014

我想執行一個命令 ( 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 行中。底部四行變成了一個靜態區域,隨著建構進度更新:目前正在建構的內容、進度百分比等。

實現您正在尋找的方法是:

  1. 將游標移動到終端的底行。
  2. 列印十個空白行以滾動掉任何現有材料。
  3. 將滾動區域設置為底部十行。
  4. 執行命令。
  5. 重置滾動區域。

轉義序列可以在許多參考資料中找到。

以下是我剛剛敲出來的東西。它適用於我在這裡的 Ubuntu VM 上的 bash。它依賴於$(( ... ))算術,並stty支持-g將 tty 設置保存在序列化字元串中。我避免使用\einprintf來表示轉義字元,這會降低它的可移植性。

我們從終端詢問行數,因為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"

# 執行命令
“$@”

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