是否可以在前台运行两个 Linux 命令并合并它们的标准输出

Sam*_*una 7 linux shell command

我需要运行 2 个 Linux 命令,每个命令都不会退出并继续输出到 stdout(直到我执行Ctrl-C它们)。

我可以在 2 个单独的终端中运行这 2 个命令,没有任何问题。

但是,我可以在一个终端中发出一个命令来在前台运行上述两个命令并让它们共享标准输出吗?

Mar*_*ell 6

您可以使用GNU Parallel非常简单地表达和控制它。假设您创建了 2 个虚拟进程,f1并且f2它们只是重复输出并且永不停止。它们可能看起来像这样:

f1

#!/bin/bash
while :; do
   echo 1,$RANDOM
   sleep 2
done
Run Code Online (Sandbox Code Playgroud)

f2

#!/bin/bash
while :; do
   echo 2,$RANDOM
   sleep 2
done
Run Code Online (Sandbox Code Playgroud)

现在你可以同时启动两者(显然 - 它不是毫无理由地称为GNU Parallel),如下所示:

parallel --line-buffer ::: ./f1 ./f2
1,17387
2,1457
2,32743
1,15684
...
...
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望输出行标记有进程名称,您可以这样做:

parallel --line-buffer --tag ::: ./f[12]
./f1    1,11877
./f2    2,28716
./f2    2,7683
./f1    1,23392
...
...
Run Code Online (Sandbox Code Playgroud)

如果您 Control-C 进程,它们都会停止 - 尽管您可以根据需要更改它 ---halt在联机帮助页上搜索。