ダイアログボックス --tailboxbg --gauge からユーザー入力を取得するには?

ダイアログボックス --tailboxbg --gauge からユーザー入力を取得するには?

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

その後、スクリプト自体の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

ベストアンサー1

おすすめ記事