게이지 바를 표시하고 스크립트 자체의 출력을 추적하려는 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