是否可以合并这两个命令的输出?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
这两个命令都不退出,所以我不知道如何执行此操作。
答案1
您可以通过将两个命令分组来组合它{ }
:
{ command1 & command2; }
到目前为止,您可以将组重定向到一个文件(最后一次;
之前}
是强制性的),并且左括号和右括号之间的空格也是如此。
{ command1 & command2; } > new_file
如果你想将STDOUT
和STDERR
分成两个文件:
{ 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
并行运行它们时,您希望输出具有整行a
s,后跟整行b
s。你做什么不是希望a
s 和b
s 在同一行混合(用单个tr -s ab
替换重复的s ,这样更容易看到会发生什么):a
a
# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
如果您使用 GNU Parallel,您会得到带有a
s 或b
s 的漂亮干净的完整行,但不会混合:
$ 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