我有一个在 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