我有一个bash脚本,它通过ssh在两台不同的计算机上生成进程,并将其中一个的输出导入到文本文件中。如何在终端中实时显示运行过程中的输出?
请查看tee
实用工具(man tee
)。
tee
命令在你想要将一个流保存到文件并继续处理它的时候非常有用。然而,如果你想要将stdout发送到两个不同的程序中,你可以使用while read循环,并将输出回显到stdout和stderr,然后将stdout流传递给一个程序,将stderr流传递给另一个程序。
echo input |
while read foo; do
echo "$foo"
echo "$foo" >&2
done 2> >( command1 1>&2 ) | command2
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:输入 STDOUT: 1:输入
注意 - while/read/echo 的方法可能无法保留换行符和二进制文本,并且过长的行会导致问题。与许多事物一样,bash 可能不是最佳解决方案。以下是一个适用于除了非常大的文件之外的所有情况的 Perl 解决方案:
echo input |
perl -wne 'print STDERR; print;' 2> >( command1 >&2) | command2
tee
来完成这个操作,你只需输入最简单的命令cat output|tee filename
。 - Kimvaiscat output | tee filename
只会捕获常规输出。如果您的程序使用标准错误处理错误,您将在屏幕上看到这些错误,但它们不会进入文件,除非您在管道前加上2>&1
,告诉 shell 将所有标准错误重定向到标准输出。 - Harvey