Answers:
您可以通过将两个命令分组在一起来组合两个命令{ }
:
{ command1 & command2; }
到目前为止,您可以将组重定向到文件(去年;
之前}
是必须的):
{ command1 & command2; } > new_file
如果要分开STDOUT
并STDERR
分成两个文件:
{ command1 & command2; } > STDOUT_file 2> STDERR_file
;
之前}
,它是强制性的!
{ yes {1..20} & yes {1..20}; } | grep -v '^1 2 3'
如果没有断线,理想情况下不会打印任何内容。
&&
代替&
! command1 & command2
-这将在后台运行command1并立即启动command2,从而并行运行两个命令并弄乱输出。 command1 && command2
-这将运行command1(在前台),然后,如果command1成功,则运行command2。
更一般而言,可以使用子外壳程序或命令分组,并立即重定向整个组的输出。
码:
( command1 ; command2 ; command3 ) | cat
{ command1 ; command2 ; command3 ; } > outfile.txt
两者之间的主要区别在于,第一个拆分子进程,而第二个拆分在主shell上下文中运行。这可能对变量的设置和使用以及其他环境设置以及性能产生影响。
不要忘记,命令分组(和函数)中的右括号必须用分号或换行符与内容分开。这是因为"}"
实际上它本身就是一个命令(关键字),必须将其视为一个。
( )
也可以。
}
根本不是命令。这是保留字。同样适用{
。我平时写这样的列表,像这样:{ command1;command2;} > outfile.txt
。您可以在分号后添加空格,但这不是必需的。不过,后面的空格{
是必要的。
( yes {1..20} & yes {1..20}; ) | grep -v '^1 2 3'
如果没有断线,理想情况下不会打印任何内容。(H / t至@antak)。
( command1 && command2 && command3 ) | cat
()
与大括号一起使用,{}
它作为背景进度运行,然后您必须处理该大括号中的输出。也管道到猫`| cat`是比`> / dev / stdout`更好的替代品
我最终还是这样做了,其他建议没有用,因为第二条命令被杀死或从未执行过。
alias app () {
nohup python ~/projects/trunk/run.py run 1>/tmp/log 2>&1 &
echo $! > /tmp/api.pid
nohup node ~/projects/trunk/index.js 1>/tmp/log 2>&1 &
echo $! > /tmp/client.pid
tail -f /tmp/log
}
tail -f *.log
尽管我从未将2个不同的进程写入同一日志文件视为问题。
yes {1..20}
command2 = 尝试此操作,yes {1..20}
并将组合的输出通过管道| grep -v '^1 2 3'
传输,如果没有折断行,则理想情况下将不输出任何内容。(H / t至@antak)。
尝试这个:
paste $(node ~/projects/trunk/index.js) $(python ~/projects/trunk/run.py run) > outputfile
到目前为止,大多数解决方案都无法很好地处理分线问题。假设这些程序是:
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的完整行,然后是s的完整行b
。您不想要的是a
s和b
s在同一行上混合(tr -s ab
用a
单个代替重复的s 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甚至可以避免填满磁盘:上面的代码可以永久运行。
对于将多个BASH命令输出组合到一行的特殊情况,以下是依次运行每个命令,删除其输出之间的所有换行符的方法。
(echo 'ab' && echo 'cd' && echo 'ef') | tr -d '\n'
>>> abcdef
作为一个实际示例,下面的代码将在两个固定字节串之间嵌入ASCII消息(在这种情况下,形成打印命令)
# hex prefix encode a message as hex hex suffix | strip newline | hex to binary | (then, for example, send the binary over a TCP connection)
(echo '1b40' && echo "Test print #1" | xxd -p && echo '1d564103') | tr -d '\n' | xxd -r -p | nc -N 192.168.192.168 9100
(注意:此方法仅在命令退出时有效。有关从不退出的命令中组合标准输出的信息,请参见其他答案。)