我正在尝试打印来自不同脚本的两个输出,这些脚本在后台与第三个脚本同时运行。
我的第三个脚本如下所示:
#!/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