
Ich habe ein Skript, das ich auf einem macOS-Computer ausführe, wo ich eine Messleiste anzeigen und gleichzeitig die Ausgabe des Skripts selbst verfolgen möchte.
Ich verwende derzeit diesen Befehl und er funktioniert gut:
#!/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...
Dies wird dialog
mit einem tailboxbg
Widget ausgeführt, das eine Protokolldatei erstellt. Und es zeigt die Ausgabe der df
Schleife in einem gauge
Widget an.
Anschließend werden STDOUT und STDERR des Skripts selbst in die Protokolldatei umgeleitet.
Auch dies funktioniert einwandfrei: Das Skript wird wie gewohnt ausgeführt, seine Ausgabe wird im tailboxbg
Widget angezeigt und gauge
die verwendete Kapazität des Datenträgers wird wie von ausgegeben angezeigt df
.
Das einzige Problem ist, dass dialog
ich jetzt keinen Zugriff mehr auf die echte STDIN (also Tastendrücke/Terminal) habe. Das bedeutet, dass ich die Cursortasten nicht mehr verwenden kann, um durch das tailboxbg
Widget zu scrollen oder dialog
auf andere Weise damit zu interagieren.
Beim Lesen der man
Seite sehe ich keine Möglichkeit, die Prozentwerte gauge
auf andere Weise in das Widget zu übertragen. Konkret heißt es für die --input-fd
Option:
--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). [...]
Eine andere Idee wäre, den echten STDIN-Code zu aliasen und ihn an tailboxbg
via weiterzugeben --input-fd
. Folgendes hat allerdings nicht funktioniert (im Vergleich zum vorherigen Verhalten hat sich nichts geändert):
...
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) &
...
Optimal wäre es, wenn --gauge
man eine Eingabedatei angeben könnte, anstatt immer STDIN wie auf der man
Seite angegeben zu lesen, aber so funktioniert es nicht.
Gibt es also eine Möglichkeit, die „echte“ STDIN (also die Benutzereingabe) an das Widget weiterzuleiten und gleichzeitig tailboxbg
die Ausgabe der fd
Schleife an das Widget weiterzuleiten?gauge