将 bash 输出通过管道传输到两个不同的流

发布于 2024-08-22 02:50:01 字数 74 浏览 6 评论 0原文

我有一个 bash 脚本,它通过 ssh 在两台不同的机器上生成进程,然后将其中一个的输出放入文本文件中。如何在终端运行时也显示输出?

I have a bashscript that spawns processes on two different machines over ssh and then cat's the output of one into a text file. How can I have the output ALSO displayed in the terminal as it's running?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

栩栩如生 2024-08-29 02:50:01

查看 tee 实用程序 (man tee)。

Look at the tee utility (man tee).

蓝戈者 2024-08-29 02:50:01

当您想要将流保存到文件并继续处理它时,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

这是一个演示,其中字符串“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

The tee command is great when you want to save a stream to a file and continue processing it. However, if you want to send stdout to two separate programs, you can use a while read loop and echo the output to stdout and stderr and then stream stdout to one program and stderr to another.

echo input | 
  while read foo; do
    echo "$foo"
    echo "$foo" >&2
  done 2> >( command1 1>&2 ) | command2

Here is a demo where the string "input" is prepended with a number to show where the outputs are going, and then sent as input to two perl programs that simply prepend the stream name.

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: /;'

output is


STDERR: 2: input
STDOUT: 1: input

Caveat - the while/read/echo thing may not preserve line endings and binary text, and long lines will cause problems. As with many things, bash may not be the best solution. Here is a perl solution for anything but really huge files:

echo input | 
  perl -wne 'print STDERR; print;' 2> >( command1 >&2) | command2
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文