cho*_*ovy 136 bash io-redirection
是否可以组合这两个命令的输出?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
Run Code Online (Sandbox Code Playgroud)
这两个命令都没有退出,所以我不确定如何执行此操作。
Gil*_*not 161
您可以通过将其与{ }以下分组来组合两个命令:
{ command1 & command2; }
Run Code Online (Sandbox Code Playgroud)
到目前为止,您可以将组重定向到一个文件(最后一个;之前}是必需的),以及左括号和右括号之间的空格。
{ command1 & command2; } > new_file
Run Code Online (Sandbox Code Playgroud)
如果你想分开STDOUT和STDERR在两个文件中:
{ command1 & command2; } > STDOUT_file 2> STDERR_file
Run Code Online (Sandbox Code Playgroud)
小智 82
更一般地,可以使用子shell 或命令分组,并一次重定向整个组的输出。
代码:
( command1 ; command2 ; command3 ) | cat
{ command1 ; command2 ; command3 ; } > outfile.txt
两者之间的主要区别在于,第一个拆分子进程,而第二个在主 shell 的上下文中运行。这可能会对变量和其他环境设置的设置和使用以及性能产生影响。
不要忘记命令分组(和函数)中的结束括号必须通过分号或换行符与内容分开。这是因为"}"它实际上是一个自己的命令(关键字),必须像一个命令一样对待。
Ole*_*nge 12
到目前为止,大多数解决方案都无法很好地处理部分线问题。假设程序是:
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
Run Code Online (Sandbox Code Playgroud)
当并行运行它们时,您希望输出具有完整的as行,然后是完整的bs行。您不想要的是as 和bs 在同一行上混合(tr -s ab用a单个 s替换重复的s a,因此更容易看到会发生什么):
# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
Run Code Online (Sandbox Code Playgroud)
如果您改为使用 GNU Parallel,您将获得带有as 或bs 但绝不会混合的漂亮干净的完整行:
$ parallel --line-buffer ::: cmd1 cmd2 | tr -s ab
a
a
b
b
b
b
a
Run Code Online (Sandbox Code Playgroud)
较新版本的 GNU Parallel 甚至可以避免填满您的磁盘:上述内容可以永远运行。
对于将多个 BASH 命令输出组合到一行的特殊情况,这里有一个方法来依次运行每个命令,删除它们输出之间的任何换行符。
(echo 'ab' && echo 'cd' && echo 'ef') | tr -d '\n'
>>> abcdef
Run Code Online (Sandbox Code Playgroud)
作为一个真实世界的例子,下面的代码将在两个固定的字节字符串之间嵌入一个 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
Run Code Online (Sandbox Code Playgroud)
(注意:此方法仅在命令退出时才有效。要从不退出的命令中组合 stdout,请参阅其他答案。)
小智 5
cat接受的答案\xe2\x80\x99s 输出可能不按正确的顺序出现,如果您的源是异步的(例如或curl),请勿使用它
使用这个代替:
\n\ncat <(command1) <(command2) <(command3) > output.txt\nRun Code Online (Sandbox Code Playgroud)\n\n现实生活中的例子:
\n\ncat \\\n<(curl https://stackoverflow.com/humans.txt) \\\n<(echo -e "\\n\\nDownloaded from https://stackoverflow.com") \\\n> output.md\nRun Code Online (Sandbox Code Playgroud)\n\n生产
\n\nThere\'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\n\nDownloaded from https://stackoverflow.com\nRun Code Online (Sandbox Code Playgroud)\n
我最终这样做了,其他建议不起作用,因为第二个命令要么被杀死,要么从未执行。
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
}
Run Code Online (Sandbox Code Playgroud)