
Tengo un script que ejecuto en una máquina macOS, donde deseo mostrar una barra de calibre y seguir la salida del script al mismo tiempo.
Actualmente uso este comando y funciona bien:
#!/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...
Esto se ejecuta dialog
con un tailboxbg
widget, que sigue un archivo de registro. Y muestra la salida del df
bucle en un gauge
widget.
Luego, STDOUT y STDERR del script se redirigen al archivo de registro.
Nuevamente, esto funciona perfectamente: el script se ejecuta como de costumbre, su salida se muestra en el tailboxbg
widget y gauge
muestra la capacidad utilizada del volumen emitida por df
.
El único problema es que dialog
ahora ya no tiene acceso al STDIN real (es decir, pulsaciones de teclas/terminal). Esto significa que no puedo usar las teclas del cursor para desplazarme por el tailboxbg
widget ni interactuar dialog
de ninguna otra manera.
Al leer la man
página, no veo gauge
ninguna otra manera de enviar los valores porcentuales al widget. Específicamente, dice para la --input-fd
opción:
--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). [...]
Otra idea sería asignar un alias al STDIN real y dárselo a tailboxbg
via --input-fd
. Sin embargo, lo siguiente no funcionó (nada cambió en comparación con el comportamiento 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) &
...
Lo óptimo sería si se --gauge
le permitiera especificar un archivo de entrada en lugar de leer siempre STDIN como se especifica en la man
página, pero esa no es la forma en que funciona.
Entonces... ¿hay alguna manera de reenviar el STDIN "real" (es decir, la entrada del usuario) al tailboxbg
widget, pero aun así canalizar la salida del fd
bucle al gauge
widget al mismo tiempo?