
バックグラウンドで3番目のスクリプトと同時に実行される異なるスクリプトの2つの出力を印刷しようとしています。
3番目のスクリプトは次のとおりです。
#!/bin/bash
./script1 &
./script2 &
各スクリプトの出力は単純な進行状況バーです。
scriptN: [##....................] (10%) (10/100)
出力が次のようになります。
script1: [##....................] (10%) (10/100)
script2: [##....................] (10%) (10/100)
答え1
少なくとも途方もない努力がなければ不可能だと思います。端末の動的進行状況バーは制御文字を使用してカーソル位置を変更し、画面に文字を再描画します。 2つのプログラムを同時に実行してそれぞれの描画内容を制御しようとすると、2つのプログラム間で競合が発生します。
たぶん、端末をエミュレートし、各出力ストリームを独立して結合してから単一のストリームに再結合するスクリプトを書くこともできますが、以前にそのようなことを試みた人は聞いたことがありません。
答え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