我有一个包含以下两个命令的Bash脚本:
ssh host tail -f /some/file | awk ..... > /some/file &
ssh host tail -f /some/file | grep .... > /some/file &
我该如何将这两个命令的输出都重定向到同一个文件中?
我有一个包含以下两个命令的Bash脚本:
ssh host tail -f /some/file | awk ..... > /some/file &
ssh host tail -f /some/file | grep .... > /some/file &
我该如何将这两个命令的输出都重定向到同一个文件中?
要么使用带有>>
的'append',要么使用大括号来包含I/O重定向,或者(偶尔)使用exec
:
ssh host tail -f /some/file | awk ..... > /some/file &
ssh host tail -f /some/file | grep .... >> /some/file &
或:{
ssh host tail -f /some/file | awk ..... &
ssh host tail -f /some/file | grep .... &
} > /some/file
或者:exec > /some/file
ssh host tail -f /some/file | awk ..... &
ssh host tail -f /some/file | grep .... &
exec
执行后,整个脚本的标准输出都会被重定向到/some/file
。我很少使用这种技术,通常我改用{ ...; }
技术。
注意:在使用花括号时必须小心。我展示的方法可以工作。试图将其压缩成一行需要您将{
视为一个命令(例如后跟一个空格),并将}
视为另一个命令。在}
之前必须有命令终止符-我使用了一个换行符,但是可以使用一个&
代表后台或者;
代表命令终止符。
因此:
{ command1; command2; } >/some/file
{ command1 & command2 & } >/some/file
我还没有解决你为什么在一个远程文件上运行两个独立的tail -f
操作,以及为什么不使用awk
强大的超级grep
来处理所有这些问题——我只解决了如何将两个命令的输入/输出重定向到一个文件的表面问题。
{ 命令列表;在括号内;}
的单行用法必须以分号结束,正如Jonathan最后一句所示。 - glenn jackman{}
视为一个命令(例如后面加上一个空格)并且在 }
之前添加命令终止符。我使用换行符作为命令终止符,但是 &
用于后台运行或 ;
也可以。 - Jonathan Leffler请注意,您可以减少SSH调用的次数:
{ ssh host tail -f /some/file |
tee >(awk ...) >(grep ...) >/dev/null
} > /some/file &
例子:
{ echo foobar | tee >(sed 's/foo/FOO/') >(sed 's/bar/BAR/') > /dev/null; } > outputfile
cat outputfile
fooBAR
FOObar
>outputfile &
),pid 将会在 $!
中。 - glenn jackmanssh_pid=$( pgrep -f "ssh host" )
- glenn jackmanssh .... | grep ...
这一行,并修改另一个命令中的awk
脚本,添加你从grep
命令获取的功能...这将作为额外的副作用消除任何交错问题。