
У меня есть скрипт, который я запускаю на компьютере с 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