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

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

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

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

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

答案1

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

fortune | tee >(pbcopy)

答案2

你的假设:

fortune | tee >(?stdout?) | pbcopy

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

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

$ echo 1 | tee /dev/stdout | sed 's/1/2/'
2
2

输出2两次而不是12tee两次输出到stdout,并且tee进程被管道stdout重定向到,因此所有这些输出都会运行,并且您会在此处看到两次。sedsed2

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

$ echo 1 | tee /dev/stderr | sed 's/1/2/'
1
2

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

$ echo 1 | tee "$(tty)" | sed 's/1/2/'
1
2

通过zsh设置选项,您根本multios不需要:tee

$ echo 1 >/dev/stderr | sed 's/1/2/'
1
2

答案3

cuonglm 都说了。

你试一试:

fortune | tee "$(tty)" | pbcopy

tty应该解析为/dev/pts/99交互式会话(即在终端中)中的实际伪终端(如 ),或者没有 tty批处理、at 和守护进程。

相关内容