Bash:将来自多个并发命令的stdout分解成列

我在bash脚本中使用单个&符运行多个命令,如下所示:

commandA & commandB & commandC 

他们每个都有自己的stdout输出,但是他们都混合在一起,洪水控制台不协调混乱。

我想知道是否有一个简单的方法来pipe输出到自己的列…使用column命令或类似的东西。 即。 就像是:

 commandA | column -1 & commandB | column -2 & commandC | column -3 

这种事情是新的,但从最初的挖掘看来,像pr这样的东西可能是票吗? 或column命令…?

Solutions Collecting From Web of "Bash:将来自多个并发命令的stdout分解成列"

pr是一个解决方案,但不是一个完美的。 考虑这个,它使用进程替换 ( <(command)语法):

 pr -m -t <(while true; do echo 12; sleep 1; done) \ <(while true; do echo 34; sleep 2; done) 

这产生了以下的行军专栏:

 12 34 12 34 12 34 12 34 

虽然这个提供了你想要的输出,但是这些列不会单独前进 – 当所有文件都提供相同的输出时,它们将一起前进。 这很棘手,因为从理论上讲,第一列应该是第二列的两倍。

您可能希望调查在平铺模式下调用tmuxscreen以允许列单独滚动。 终端复用器将提供必要的机制来缓冲输出并独立地进行滚动,这对于并行显示输出并不允许来自commandB的过多输出来滚动commandA和commandC off-screen是很重要的。 请记住,分别滚动每列需要大量的屏幕重绘,而避免屏幕重绘的唯一方法是让所有三列同时产生输出。

作为最后一个解决方案,请考虑将每个输出传送到一个命令,使每列的缩进量不同 :

 this is something that commandA outputs and is and here is something that commandB outputs interleaved with the other output, but visually you might have an easier time distinguishing one here is something that commandC outputs which is also interleaved with the others from the other 

遗憾地回答我自己的问题。

所提供的解决方案都不是我正在寻找的。 所以我开发了我自己的命令行工具: multiview 。 也许别人会受益?

它通过管道进程的stdout / stderr到一个命令接口,然后启动一个“查看器”来查看他们的输出列:

 fooProcess | multiview -s & \ barProcess | multiview -s & \ bazProcess | multiview -s & \ multiview 

这将显示他们的输出整齐组织的列视图。 您也可以通过在-s标志之后添加一个字符串来命名每个进程:

 fooProcess | multiview -s "foo" & \ barProcess | multiview -s "bar" & \ bazProcess | multiview -s "baz" & \ multiview 

还有其他一些选择,但这是它的要点。

希望这可以帮助!

脚本打印出三个垂直行和一个计时器,每行包含单个脚本的输出。 评论任何你不明白,并根据需要添加答案我的答案

希望这可以帮助 :)

 #!/bin/bash #Script by jidder count=0 Elapsed=0 control_c() { tput rmcup rm tail.tmp rm tail2.tmp rm tail3.tmp stty sane } Draw() { tput clear echo "SCRIPT 1 Elapsed time =$Elapsed seconds" echo "------------------------------------------------------------------------------------------------------------------------------------------------------" tail -n10 tail.tmp tput cup 25 0 echo "Script 2 " echo "------------------------------------------------------------------------------------------------------------------------------------------------------" tail -n10 tail2.tmp tput cup 50 0 echo "Script 3 " echo "------------------------------------------------------------------------------------------------------------------------------------------------------" tail -n10 tail3.tmp } Timer() { if [[ $count -eq 10 ]]; then Draw ((Elapsed = Elapsed + 1)) count=0 fi } main() { stty -icanon time 0 min 0 tput smcup Draw count=0 keypress='' MYSCRIPT1.sh > tail.tmp & MYSCRIPT2.sh > tail2.tmp & MYSCRIPT3.sh > tail3.tmp & while [ "$keypress" != "q" ]; do sleep 0.1 read keypress (( count = count + 2 )) Timer done stty sane tput rmcup rm tail.tmp rm tail2.tmp rm tail3.tmp echo "Thanks for using this script." exit 0 } main trap control_c SIGINT