如何在對話框 --tailboxbg --gauge 中獲取用戶輸入?

如何在對話框 --tailboxbg --gauge 中獲取用戶輸入?

我有一個在 macOS 計算機上運行的腳本,我希望在其中顯示儀表條並同時追蹤腳本本身的輸出。

我目前使用這個指令,效果很好:

#!/bin/bash

TERMINAL_COLS=$(tput cols)
TERMINAL_ROWS=$(tput lines)

(while true ; do
     df /Volumes/Backup/ | tail -1 | awk '{print int($3/($3+$4)*100)}'
     sleep 1
 done | dialog --no-shadow --begin 7 0 \
               --tailboxbg /tmp/backup.log $(( $TERMINAL_ROWS - 7 )) $TERMINAL_COLS \
               --and-widget --begin 0 0 \
               --gauge 'Backup volume usage' 7 $TERMINAL_COLS) &

exec >> /tmp/backup.log
exec 2>&1

...rest of script...

dialog與一個tailboxbg小部件一起運行,該小部件跟踪日誌文件。它df在小部件中顯示循環的輸出gauge

之後,腳本本身的 STDOUT 和 STDERR 被重新導向到日誌檔案中。

同樣,這工作得很好:腳本照常運行,其輸出顯示在tailboxbg小部件中,並且gauge顯示由 發出的捲的已用容量df

唯一的問題是dialog現在無法再存取真正的 STDIN(即按鍵/終端)。這意味著我無法使用遊標鍵滾動小部件,或以任何其他方式tailboxbg進行互動。dialog

閱讀該頁面,我沒有看到以任何其他方式man獲取小部件百分比值的方法。gauge具體來說,它表示該--input-fd選項:

   --input-fd fd
          Read keyboard input from the given file descriptor.  Most dialog
          scripts read from the standard input, but the gauge widget reads
          a pipe (which is always standard input).  [...]

另一個想法是為真正的 STDIN 起別名並將其提供給tailboxbgvia --input-fd。但以下內容不起作用(與先前的行為相比沒有任何改變):

...

exec 5<&0

(while true ; do
     df /Volumes/Backup/ | tail -1 | awk '{print int($3/($3+$4)*100)}'
     sleep 1
 done | dialog --input-fd 5 --no-shadow --begin 7 0 --tailboxbg /tmp/backup.log $(( $TERMINAL_ROWS - 7 )) $TERMINAL_COLS --and-widget --begin 0 0 --gauge 'Backup volume usage' 7 $TERMINAL_COLS) &

...

最佳方案是--gauge允許指定輸入檔案而不是始終讀取頁面中指定的 STDIN man,但這不是它的工作方式。

那麼...有沒有一種方法可以將“真正的”STDIN(即用戶輸入)轉發到小部件,但同時tailboxbg仍將循環的輸出通過fd管道傳輸到小部件?gauge

相關內容