두 개의 백그라운드 스크립트의 출력을 인쇄합니다.

두 개의 백그라운드 스크립트의 출력을 인쇄합니다.

백그라운드에서 세 번째 스크립트와 동시에 실행되는 서로 다른 스크립트의 두 출력을 인쇄하려고 합니다.

세 번째 스크립트는 다음과 같습니다.

#!/bin/bash
./script1 &
./script2 &

각 스크립트의 출력은 간단한 진행률 표시줄입니다.

scriptN: [##....................] (10%) (10/100)

출력이 다음과 같기를 원합니다.

script1: [##....................] (10%) (10/100)
script2: [##....................] (10%) (10/100)

답변1

적어도 엄청난 노력 없이는 불가능하다고 생각합니다. 터미널의 동적 진행률 표시줄은 제어 문자를 사용하여 커서 위치를 변경하고 화면에 문자를 다시 그립니다. 두 개의 프로그램을 동시에 실행하여 각각 그려지는 내용을 제어하려고 하면 두 프로그램 사이에 충돌이 발생합니다.

어쩌면 터미널을 에뮬레이트하고 각 출력 스트림을 독립적으로 결합한 다음 이를 단일 스트림으로 재결합하는 스크립트를 작성할 수도 있지만 이전에 그런 일을 시도하는 사람은 들어본 적이 없습니다.

답변2

약간 해킹적이며 화면에 스팸을 표시하므로 뒤로 스크롤하기가 쉽지 않지만 작동해야 합니다.

#!/bin/bash
output1=$(mktemp /tmp/tmpout.XXXXXX)
output2=$(mktemp /tmp/tmpout.XXXXXX)
./script1 &> $output1 &
pid1=$!
./script2 &> $output2 &
pid2=$!

while [ -d "/proc/$pid1" ] || [ -d "/proc/$pid2" ]
do
   clear
   tail -n 1 $output1
   tail -n 1 $output2
   sleep 1
done
rm -f $output1 $output2

답변3

약간의 조사와 @ZacharyBrady의 도움으로 작업한 후

#!/bin/bash
output1=$(mktemp /tmp/tmpout.XXXXXX)
output2=$(mktemp /tmp/tmpout.XXXXXX)
./script1 &> $output1 &
pid1=$!
./script2 &> $output2 &
pid2=$!

while [ -d "/proc/$pid1" ] || [ -d "/proc/$pid2" ]
do
    out1="$(tail -n 1 $output1)"
    out2="$(tail -n 1 $output2)"
    echo $out1
    echo $out2
    tput cuu1  # move cursor up by one line
    tput el # clear the line
    tput cuu1
    tput el
done
rm -f $output1 $output2    

관련 정보