node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
两个命令均不退出,所以我不确定如何执行此操作。
#1 楼
您可以通过将其与{ }
分组来组合两个命令:到目前为止,您可以将组重定向到文件(在;
之前是最后一个}
),并且{ command1 & command2; }
如果要将
STDOUT
和STDERR
分为两个文件:{ command1 & command2; } > new_file
评论
没关系,他们的程序没有完成。 'tail -f'也不“完成”,但这仍然有效并且将两个程序的输出组合在一起。同样适用于两个以上的命令。 ^ c退出只会杀死组合的命令之一。不过,您必须手动杀死对方。
– SuperMagic
13年2月14日在4:58
好像你没有最后一个;在}之前,它是强制性的!
–吉尔斯·奎诺(Gilles Quenot)
2014年12月2日在18:27
请注意:这不会保留整行!随着行的一部分分开并相互混合,您将获得不可靠的输出。您可以使用{yes {1..20}&yes {1..20}; } | grep -v'^ 1 2 3'理想情况下,如果行未中断,则不会打印任何内容。
–antak
17年1月17日在1:41
我宁愿使用&&代替&! command1&command2-这将在后台运行command1并立即启动command2,从而并行运行两个命令并弄乱输出。 command1 && command2-这将运行command1(在前台),然后,如果command1成功,则运行command2。
–杜尊
18-4-5在11:04
@DUzun OP表示没有命令退出,因此在您的解决方案中,第二条命令将永远不会运行
–Zoey Hewll
18年5月31日在2:25
#2 楼
更一般而言,可以使用子外壳程序或命令分组,并立即重定向整个组的输出。代码:
( command1 ; command2 ; command3 ) | cat
{ command1 ; command2 ; command3 ; } > outfile.txt
两者之间的主要区别是,第一个拆分了子进程,而第二个拆分了主外壳程序。这可能会对变量的设置和使用以及其他环境设置以及性能产生影响。
不要忘记命令分组(和函数)中的右括号必须与内容分开用分号或换行符。这是因为
"}"
实际上是它自己的命令(关键字),必须将其视为一个命令。评论
从()重定向也可以正常工作。
–muru
2015年1月1日,12:49
}根本不是命令。这是保留字。 {也是如此。我通常这样写这样的列表:{command1; command2;}> outfile.txt。您可以在分号后添加空格,但这不是必需的。不过,{后面的空格是必需的。
–通配符
16年5月6日在2:45
请注意:这不会保留整行!随着行的一部分分开并相互混合,您将获得不可靠的输出。您可以尝试使用(yes {1..20}&yes {1..20};)| grep -v'^ 1 2 3'理想情况下,如果行未中断,则不会打印任何内容。 (H / t至@antak)。
–奥雷·丹吉(Ole Tange)
17年11月15日在7:36
有时,您只想在命令成功后才运行command2:(command1 && command2 && command 3)|猫
–杜尊
18年4月5日在11:08
我更喜欢将圆括号()用作大括号{},并将其作为背景进度运行,然后您必须处理该输出。也管道到猫`|与`> / dev / stdout`相比,cat`是更好的选择
– DarkMukke
18年6月19日在10:36
#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
,因此更容易看到发生的情况):# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
如果改为使用GNU Parallel,则可以使用
tr -s ab
或a
获得整洁的整行,但不要混用:$ parallel --line-buffer ::: cmd1 cmd2 | tr -s ab
a
a
b
b
b
b
a
GNU Parallel的较新版本甚至可以避免填满磁盘:以上内容可以永久运行。
#4 楼
对于将多个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
(注意:该方法仅在命令退出时有效。有关从不退出的命令中组合标准输出的信息,请参阅其他答案。)
评论
(1)请显示第二条命令的(预期)输出。 (2)请说明OP将如何使用该技术解决他的问题。
–斯科特
19年7月11日在19:28
1)第二个命令的输出是非ascii二进制,因此显示它不会有用。 2)OP可能在2013年至今解决了他的特定问题。现在,这个问题实际上是组合多个Bash命令的stdout的参考,因此,我相信一种将它们组合在一行上的技术是在这里提到的有用的“食谱”(因为我来这里是为了寻找它,却找不到它)。
–卢克
19年7月15日在5:34
#5 楼
我最终还是这样做了,其他建议没有用,因为第二条命令被杀死或从未执行过。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
}
评论
注意:如果两个进程试图“同时”写入文件,则可能会导致I / O错误。
– Djizeus
16年11月16日在15:06
可以指定2个不同的日志文件并执行tail -f * .log,尽管我从未将这看作是2个不同进程写入同一日志文件的问题。
–碎肉
16-11-16在20:25
@chovy:您能在这里将您的问题写为问题吗?这很有用
– Abdennour TOUMI
16-11-22在17:58
请注意:这不会保留整行!随着行的一部分分开并相互混合,您将获得不可靠的输出。您可以使用command1 = yes {1..20}来尝试这个命令,而command2 = yes {1..20}并通过|来组合输出。 grep -v'^ 1 2 3'理想情况下,如果行未中断,则不会打印任何内容。 (H / t至@antak)。
–奥雷·丹吉(Ole Tange)
17年11月15日在7:38
最重要的是,如果数据量很大,则磁盘可能已满。
–奥雷·丹吉(Ole Tange)
17年11月15日在7:39
#6 楼
试试这个:paste $(node ~/projects/trunk/index.js) $(python ~/projects/trunk/run.py run) > outputfile
评论
“粘贴”是做什么的?
–碎肉
13年2月14日在5:24
@chovy,请参阅此处:techrepublic.com/article/…不过,不确定在这种情况下是否可以使用。
–FixMaker
13年2月14日在10:59
我认为粘贴在这里不合适,因为它的意思是将列彼此相邻
–伯恩哈德
13年2月15日在22:06
确实是@Bernhard。但这不是要求中指定的
–frogstarr78
13年2月16日在3:04
@ frogstarr78我认为这不太可能是他想要的,但是您说的没错,未指定。
–伯恩哈德
13年2月16日在10:24
#7 楼
接受的答案的输出可能未按正确的顺序排列,如果您的源是异步的(例如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
#8 楼
由于您已经在使用node
,因此您可能希望同时尝试同时运行多个命令。类似于
npm run watch-js & npm run watch-less
,但效果更好。
评论
如果程序没有完成,大概是它们连续写输出?您想对它们的输出做什么?交错线,...?为什么要这样做?node命令输出不多,但仍需要运行。 python一个输出所有请求,我想捕获它们并在同一个shell窗口中观看它们。
这两个命令的输出已经被写入相同的流(它们每个都为stdout继承了相同的文件描述符)。这样您就无需执行任何操作。