有没有办法通过管道输出命令并将其定向到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
两次而不是1
和2
。tee
两次输出到stdout
,并且tee
进程被管道stdout
重定向到,因此所有这些输出都会运行,并且您会在此处看到两次。sed
sed
2
您必须使用其他文件描述符,例如标准错误/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 和守护进程。