如何在对话框 --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

相关内容