2つのバックグラウンドスクリプトの出力を印刷します。

2つのバックグラウンドスクリプトの出力を印刷します。

バックグラウンドで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    

関連情報