在 bash 中合并两个命令的输出

在 bash 中合并两个命令的输出

是否可以合并这两个命令的输出?

node ~/projects/trunk/index.js 
python ~/projects/trunk/run.py run

这两个命令都不退出,所以我不知道如何执行此操作。

答案1

您可以通过将两个命令分组来组合它{ }

{ command1 & command2; }

到目前为止,您可以将组重定向到一个文件(最后一次;之前}是强制性的),并且左括号和右括号之间的空格也是如此

{ command1 & command2; } > new_file

如果你想将STDOUTSTDERR分成两个文件:

{ command1 & command2; } > STDOUT_file 2> STDERR_file

如果您不想在后台运行第一个命令,请使用以下形式:

{ command1; command2; }

或者

{ command1 && command2; }

仅当第一个命令成功时才运行第二个命令

答案2

更一般地,可以使用子 shell 或命令分组,并立即重定向整个组的输出。

代码:

( command1 ; command2 ; command3 ) | cat

{ command1 ; command2 ; command3 ; } > outfile.txt

两者之间的主要区别在于,第一个进程分裂子进程,而第二个进程在主 shell 的上下文中运行。这可能会对变量的设置和使用以及其他环境设置以及性能产生影响。

不要忘记命令分组(和函数)中的右括号必须用分号或换行符与内容分隔。这是因为"}"它实际上是一个命令(关键字),必须像命令一样对待。

答案3

迄今为止,大多数解决方案都未能很好地解决部分线路问题。假设这些程序是:

cmd1() {
    perl -e 'while(1) { print "a"x3000_000,"\n"}'
}
export -f cmd1
cmd2() {
    perl -e 'while(1) { print "b"x3000_000,"\n"}'
}
export -f cmd2

并行运行它们时,您希望输出具有整行as,后跟整行bs。你做什么不是希望as 和bs 在同一行混合(用单个tr -s ab替换重复的s ,这样更容易看到会发生什么):aa

# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab

如果您使用 GNU Parallel,您会得到带有as 或bs 的漂亮干净的完整行,但不会混合:

$ parallel --line-buffer ::: cmd1 cmd2 | tr -s ab
a
a
b
b
b
b
a

较新版本的 GNU Parallel 甚至可以避免填满磁盘:上面的代码可以永远运行。

答案4

cat接受的答案的输出可能不按正确的顺序出现,如果您的源是异步的(例如或curl),请勿使用它

使用这个代替:

cat <(command1) <(command2) <(command3) > output.txt

现实生活中的例子:

cat \
<(curl https://stackoverflow.com/humans.txt) \
<(echo -e "\n\nDownloaded from https://stackoverflow.com") \
> output.md

生产

There's a bunch of humans behind Stack Overflow and the network of Stack Exchange sites. If you'd like to join us check out https://stackoverflow.com/company/work-here

Downloaded from https://stackoverflow.com

相关内容