也许这是重复的,但我还没有找到任何答案,但是如何使用管道将一个命令输出到多个输出(例如将其发送到管道、标准输出或命令替换)?
我有这一行:
$ command_with_output1 | tee >(command_with_output2) | command3
我想将输出从发送command_with_output1
到stdout
via tee
,也发送到command_with_output2
via >()
,也发送到command3
via |
。是否可以?如何实现这一目标?
一个无意义的例子,但为了演示我的意思,可以如下:
- 管道问题
$ 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
因此,我认为,第二个丢失的输出将在管道之后“丢失”(管道不会stdout
从tee
tostdin
传递while
),因为tee
可能只适用于文件,没有管道(如果我在这里错了,请纠正我)。
- 标准输出传递问题
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