대화 상자 --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

관련 정보