我有一个bashscript,它通过ssh在两台不同的机器上生成进程,然后cat将一个输出生成一个文本文件。如何在终端显示输出时显示输出?
答案 0 :(得分:6)
查看tee
实用程序(man tee
)。
答案 1 :(得分:4)
如果要将流保存到文件并继续处理,tee
命令很棒。但是,如果要将stdout发送到两个单独的程序,可以使用while读取循环并将输出回显到stdout和stderr,然后将stdout传递给一个程序,将stderr传递给另一个程序。
echo input |
while read foo; do
echo "$foo"
echo "$foo" >&2
done 2> >( command1 1>&2 ) | command2
这是一个演示,其中字符串“input”前面带有一个数字,用于显示输出的位置,然后作为输入发送到两个只添加流名称的perl程序。
echo input |
while read foo; do
echo "1: $foo"
echo "2: $foo" >&2
done 2> >( perl -wpe 's//STDERR: /;' 1>&2) | perl -wpe 's//STDOUT: /;'
输出
STDERR: 2: input STDOUT: 1: input
警告 - while / read / echo事物可能不会保留行结尾和二进制文本,而长行会导致问题。与许多事情一样,bash可能不是最好的解决方案。这是一个perl解决方案,除了非常大的文件之外的任何东西:
echo input |
perl -wne 'print STDERR; print;' 2> >( command1 >&2) | command2