在 Bash 中建立類似表格的 CLI 顯示的最佳方法?

在 Bash 中建立類似表格的 CLI 顯示的最佳方法?

我正在編寫一個用於大規模 USB 快閃記憶體測試的 Bash 腳本(f3在後台使用)。我需要顯示一個包含多個列和單元格的類似表格的介面。

目前我正在使用printfwith ,它看起來像這樣:

在此輸入影像描述

我為每個驅動器運行一個單獨的函數,將文字寫入日誌檔案。解析這些日誌檔案以向使用者顯示資訊。

正如您所看到的,有些行具有不應該存在的偏移量,但我無法擺脫它們,這似乎不是由列印的長字串引起的。我不知道這是什麼。

我遇到的另一個問題是刷新時間以及有時需要手動清除和重繪整個螢幕,因為偶爾會出現 stderr 訊息grepcat某些檔案無法正確讀取。

我目前正在對該腳本進行部分重寫,並且我可以更好地在螢幕上列印資料。我想過調查一下,ncurses但這似乎有點太複雜了,可能會讓我維護起來變得複雜。

我想知道是否有一種方法可以讓我將echoprint命令轉儲到文本文件中,然後立即執行所有命令以基本上擁有一個文本“後緩衝區”,以便我的刷新可以更加一致和更快?

我還希望能夠監聽用戶的擊鍵並在後台做出反應,但這不是優先事項。

也許有更好的方法在 Bash 中做這種事情,但我不知道?

答案1

使用column -t應該適合你。

答案2

您可以使用tput行動遊標,例如tput cup 0 0; echo test將寫「測試」到螢幕的左上角。

或者,如果您想使用緩衝方法,您可以將行轉儲到檔案中,清除螢幕並捕獲檔案:

# In program setup
TEMPFILE=$(mktemp) # Create temporary file
trap "rm -f $TEMPFILE" EXIT # Remove temporary on exit

# Main lopp
while true
do
  echo "TEST" >$TEMPFILE # Clear file and set first line with >
  date >>$TEMPFILE # Append lines to file with >>

  clear # Clear the screen
  cat $TEMPFILE # Dump the file
  sleep 1 # Just for testing to avoid high CPU
done

trap如果您想保留臨時檔案以進行偵錯,請註解掉該行。

答案3

我認為您已經幾乎實現了您的目標,儘管存在一些小錯誤,並且可能存在一些效能問題。就我個人而言,我會先嘗試解決錯誤,然後試著了解可以改進效能的地方。然而,關於刷新率,即使是像 top 或 watch 這樣的程式通常每 2 或 1 秒刷新一次,這通常就足夠了。你沒有說,你想達到什麼速度。

有一個類似的堆疊交換問題,其中有兩個答案/建議,

  1. 使用該程式dialog是另外一件需要學習的事情。
  2. 顯示 bash 函數的創建,用於清除、重置、在螢幕上的某個位置寫入文本,這是您可能會在 中使用的一組類似函數ncurses,但具有使用echo(bash 內建函數)的優點,因此它不承擔運行/usr/bin/printf格式化輸出的開銷。

依序解決您的問題。

  1. 從後台命令列印錯誤。/dev/null如果您只想丟棄它,則將 stderr 重定向 到一個檔案以供以後處理。

  2. 列錯誤,顯示您的程式碼,輸入資料和所需的輸出,然後我們可以提出建議。此 bug 可能是 bug #1 的影響,因此請先解決 #1,然後再解決此問題(如果它仍然存在)。

  3. 效能,(編輯您的問題)並添加您的程式碼,以便我們可以看到您在做什麼並提出建議。

另一種方法是使用不同的腳本解釋器,有很多選擇取決於您熟悉的腳本解釋器。 (awk、python、perl、其他 shell,...)。但是,如果您不打算使用 ncurses,其bash原理將類似於第二個答案多於。

相關內容