直接输出到管道和标准输出

use*_*492 27 bash pipe tee stdout

有没有办法通过管道传输命令的输出并将其定向到stdout

例如,fortune打印一个幸运饼干stdout并将其通过管道传输到下一个命令:

$ fortune | tee >(?stdout?) | lolcat 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and
the Ugly)."
(By Matt Welsh)
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 27

tee始终写入其标准输出。如果您想将数据发送到除标准输出已经在的终端之外的命令,只需使用该命令的进程替换即可。(请注意,尽管以 开头>,但进程替换不会重定向标准输出,tee命令会将其视为参数。)

fortune | tee >(pbcopy)
Run Code Online (Sandbox Code Playgroud)


cuo*_*glm 19

你的假设:

fortune | tee >(?stdout?) | pbcopy
Run Code Online (Sandbox Code Playgroud)

将不起作用,因为fortune输出将被写入标准输出两次,因此您会将输出加倍到pbcopy.

在 OSX(和其他系统支持/dev/std{out,err,in})中,您可以检查它:

$ echo 1 | tee /dev/stdout | sed 's/1/2/'
2
2
Run Code Online (Sandbox Code Playgroud)

输出2两次而不是1and 2tee输出两次到stdouttee进程stdoutsed管道重定向到,所以所有这些输出都通过sed,你2在这里看到双倍。

您必须使用其他文件描述符,例如标准错误通过/dev/stderr

$ echo 1 | tee /dev/stderr | sed 's/1/2/'
1
2
Run Code Online (Sandbox Code Playgroud)

或用于tty获取连接的伪终端:

$ echo 1 | tee "$(tty)" | sed 's/1/2/'
1
2
Run Code Online (Sandbox Code Playgroud)

随着zshmultios选项设置,你并不需要tee在所有:

$ echo 1 >/dev/stderr | sed 's/1/2/'
1
2
Run Code Online (Sandbox Code Playgroud)

  • `tee $(tty)` 或者,你知道,`tee /dev/tty` (2认同)