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


14

我想知道是否可以通过管道将命令的输出定向到标准输出。因此,例如,fortune打印一个幸运饼干并将其复制到剪贴板:

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

我手头没有OSX,怎么fortune | tee $(tty) | pbcopy办?
Archemar '16

Answers:


9

您的假设:

fortune | tee >(?stdout?) | pbcopy

将不起作用,因为fortune输出将两次写入标准输出,因此您将输出倍增至pbcopy

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

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

输出2两次,而不是12

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

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

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

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

使用zshmultios选项设置,您根本不需要tee

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

tee $(tty)或者,您知道tee /dev/tty

很好的解释,所以SO全方位回答。
Merlin

11

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

fortune | tee >(pbcopy)

这很好,也是很好的解决方案。
Merlin

0

cuonglm说了一切。

你试一试:

fortune | tee "$(tty)" | pbcopy

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.