명령 출력이 포함된 Bash 콘솔 진행 대화 상자

명령 출력이 포함된 Bash 콘솔 진행 대화 상자

나는 dialog그것을 설치했고 다음과 같은 멋진 진행 대화 상자를 갖고 싶습니다.

+-------[ title ]--------+
|                        |
| +-[ console output ]-+ |
| | output line11      ^ |
| | output line12      | |
| | output line13      | |
| | output line14      # |
| | output line15      | |
| | output line16      v |
| +--------------------+ |
| #########80%#####::::: |
+------------------------+

예를 들어 배포판에서 5개의 패키지를 업그레이드하는 경우 진행 상황(여기서는 5개 패키지 중 4개의 패키지가 업그레이드됨, 즉 80%)을 표시하지만 실행된 명령의 자세한 출력을 표시합니다. 가능합니까?

--tailboxbg나는 이것이 사실이라고 생각하지만 작동하는 솔루션을 사용하거나 얻을 수 없습니다 --gauge.

답변1

예, 다음과 같이 할 수 있습니다 --gauge.

#!/bin/bash
declare PACKAGES=("/etc/crontab"  "/etc/dmtab"  "/etc/fstab"  "/etc/inittab"  "/etc/mtab")
NUM_PACKAGES=${#PACKAGES[*]} # no. of packages to update (#packages in the array $PACKAGES)
step=$((100/$NUM_PACKAGES))  # progress bar step
cur_file_idx=0
counter=0
DEST=${HOME}
(
# infinite while loop
while :
do
    cat <<EOF
XXX
$counter
$counter% upgraded

$COMMAND
XXX
EOF
    COMMAND="cp ${PACKAGES[$cur_file_idx]} $DEST &>/dev/null" # sets/updates command to exec.
    [[ $NUM_PACKAGES -lt $cur_file_idx ]] && $COMMAND # executes command

    (( cur_file_idx+=1 )) # increase counter
    (( counter+=step ))
    [ $counter -gt 100 ] && break  # break when reach the 100% (or greater
                                   # since Bash only does integer arithmetic)
    sleep 10 # delay it a specified amount of time i.e. 1 sec
done
) |
dialog --title "File upgrade" --gauge "Please wait..." 10 70 0

이 코드가 실제로 수행하는 작업은 다음과 같습니다.

            진행률 표시줄 애니메이션

노트. 이 코드는 실제로 이 5개 파일을 폴더에 복사 /etc/합니다 $HOME.

답변2

--tailboxbg와 함께 사용하는 것은 맞지만 다른 --gauge파일 설명자를 올바른 순서로 들어야 합니다( --tailboxbg첫 번째).

__MACROS__이중 밑줄을 관련 내용으로 변경

let total=__GET_MAX_COUNT__
let idx=0
let percent=0
let width=$(tput cols)
let height=$(tput lines)
log=$(mktemp --tmpdir dialog-progress.logXXX)

(for __LOOP__; do
cat <<EOF
XXX
$percent
Processing item $index ($percent %)
XXX
EOF
     let idx++
     let "percent = 100 * idx / total"
     __COMMAND__ >> $log
 done
) | dialog \
        --title "Dialog example progress with command output" \
        --begin 12 2 \
        --tailboxbg $log $((height - 14)) $((width - 6)) \
        --and-widget \
        --begin 2 2 \
        --gauge "Converting ..." 8 $((width - 6)) 0

관련 정보