Как получить пользовательский ввод в диалоге --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

Связанный контент