如何将带有 tee 的一个命令输出到标准输出并将其通过管道传输到另一命令?

如何将带有 tee 的一个命令输出到标准输出并将其通过管道传输到另一命令?

也许这是重复的,但我还没有找到任何答案,但是如何使用管道将一个命令输出到多个输出(例如将其发送到管道、标准输出或命令替换)?

我有这一行:

$ command_with_output1 | tee >(command_with_output2) | command3

我想将输出从发送command_with_output1stdoutvia tee,也发送到command_with_output2via >(),也发送到command3via |。是否可以?如何实现这一目标?

一个无意义的例子,但为了演示我的意思,可以如下:

  1. 管道问题
    $ cat <<< "abc" | tee >( > /dev/null) | while read i; do echo "$i"; done
    

此命令应输出 2 次“abc”(1. - tee、 2. - while read...),但实际上只输出一次:

user@host:~$ cat <<< "abc"| tee >( > /dev/null) | while read i; do echo $i; done
abc #only one, I would expect one more

因此,我认为,第二个丢失的输出将在管道之后“丢失”(管道不会stdoutteetostdin传递while),因为tee可能只适用于文件,没有管道(如果我在这里错了,请纠正我)。

  1. 标准输出传递问题
    cat <<< "abc" | tee >(xargs -I{} bash -c "for i in '{}'; do echo $i; done")
    

虽然这个命令不使用管道 "after" tee,我也希望输出 2 次 "abc" (再次tee,现在for i in ...),但是,只输出一次:

user@Host:~$ cat <<< "abc" | tee >(xargs -I{} bash -c "for i in '{}'; do echo $i; done")
abc #only one, I would expect one more

所以解释一下:在第一个命令中,我是否正确,tee不会输出到管道(而是输出到文件)。对于第二个命令解释,为什么不输出2次,为什么该xargs命令不将输出传递'{}'bash

答案1

解释一下你的管道问题

让我们把它分解成更小的块:

$猫<<<“abc”--> 该命令将字符串“abc”传递到左边命令的标准输入,即

|三通 >( > /dev/null)--> 的球座命令从命令获取输入通过读取标准输入,将文件输出传递到/dev/null,然后将字符串“abc”写入标准输出。

|当读我时;回显“$i”;完毕--> 的命令从标准输入读取字符串“abc”并将字符串“abc”存储到变量然后你的循环打印的内容这是字符串“abc”——而且只有一次。

球座命令在终端上不打印任何内容,因为它的输出通过管道传输到命令。

您可以尝试将标准输出写入文件。

user@host:~$ cat <<< "abc"| tee file_name.txt | while read i; do echo $i >> file_name.txt; done; cat file_name.txt

相关内容