
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
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