
Eu tenho um script que executo em uma máquina macOS, onde desejo mostrar uma barra de medidor e acompanhar a saída do próprio script ao mesmo tempo.
Atualmente uso este comando e funciona bem:
#!/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...
Isso é executado dialog
com um tailboxbg
widget, que segue um arquivo de log. E mostra a saída do df
loop em um gauge
widget.
Posteriormente, o STDOUT e STDERR do próprio script são redirecionados para o arquivo de log.
Novamente, isso funciona perfeitamente bem: o script é executado normalmente, sua saída é exibida no tailboxbg
widget e gauge
mostra a capacidade usada do volume emitida por df
.
O único problema é que dialog
agora não há mais acesso ao STDIN real (ou seja, pressionamentos de teclas/terminal). Isso significa que não posso usar as teclas do cursor para rolar pelo tailboxbg
widget ou interagir dialog
de qualquer outra forma.
Lendo a man
página, não vejo gauge
outra forma de obter os valores percentuais para o widget. Especificamente, diz para a --input-fd
opção:
--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). [...]
Outra ideia seria apelidar o STDIN real e entregá-lo ao tailboxbg
via --input-fd
. O seguinte não funcionou (nada mudou em comparação com o comportamento anterior):
...
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) &
...
O ideal seria --gauge
especificar um arquivo de entrada em vez de sempre ler STDIN conforme especificado na man
página, mas não é assim que funciona.
Então... existe uma maneira de encaminhar o STDIN "real" (ou seja, entrada do usuário) para o tailboxbg
widget, mas ainda canalizar a saída do fd
loop para o gauge
widget ao mesmo tempo?