
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
で実行され、ログ ファイルを tail します。そして、ウィジェットにループ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). [...]
もう 1 つのアイデアは、実際の 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