打印两个后台脚本的输出

打印两个后台脚本的输出

我正在尝试打印来自不同脚本的两个输出,这些脚本在后台与第三个脚本同时运行。

我的第三个脚本如下所示:

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

每个脚本的输出都是一个简单的进度条:

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

我希望输出是这样的:

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

答案1

我认为这是不可能的,至少在不付出巨大努力的情况下是不可能的。终端中的动态进度条依靠控制字符来更改光标的位置并在屏幕上重绘字符。同时运行两个程序,每个程序都试图控制正在绘制的内容,这将导致两个程序之间发生冲突。

也许可以编写一个脚本来模拟终端并独立地组合每个输出流,然后将它们重新组合成一个流,但我之前没有听说有人尝试过这样的事情。

答案2

这有点hacky,并且会在您的屏幕上发送垃圾邮件,因此向后滚动并不容易,但应该可以。

#!/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    

相关内容