백그라운드에서 세 번째 스크립트와 동시에 실행되는 서로 다른 스크립트의 두 출력을 인쇄하려고 합니다.
세 번째 스크립트는 다음과 같습니다.
#!/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