ゲージバーを表示し、スクリプト自体の出力を追跡したい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
です--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