
我有一個在 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 起別名並將其提供給tailboxbg
via --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