将stdout开到stderr吗?


17

我想将stdout从一个进程发送到另一个进程的stdin,而且还发送到控制台。例如,将stdout发送到stdout + stderr。

例如,我git edit别名如下:

git status --short | cut -b4- | xargs gvim --remote

我希望将文件名列表也发送到屏幕xargs

那么,有没有类似tee的工具可以做到这一点?这样我可以做类似的事情:

git status --short | \
    cut -b4- | almost-but-not-quite-entirely-unlike-tee | \
    xargs gvim --remote

Answers:


14

tee 可以通过使用复制到当前控制台 tee /dev/tty

git status --short | cut -b4- | tee /dev/tty | xargs gvim --remote

/dev/stdout或者,您可以使用或,/dev/stderr但是如果您的命令位于脚本内,则可以将其重定向。请注意,/dev/tty它将始终是控制台(并且可能不存在于非交互式外壳中)。 这是错误的,请阅读注释。


1
确实,您显示的管道/dev/stdout 重定向。也就是说,如果您使用tee /dev/stdout的效果是将所有内容发送到xargs两次,而没有任何内容发送到终端。
celtschk 2014年

/dev/stdout没有通过管道重定向,它将保留当前过程标准输出。但是,如果将命令封装在脚本中,然后重定向此脚本的标准输出,/dev/stdout则将被重定向。在交互式控制台,tee /dev/tty并且tee /dev/stdout具有相同的效果,使用管道时也是如此。
文森特·罗伯特

如果您不相信我,请启动您的shell并输入echo foo | tee /dev/stdout | tr f becho foo | tee /dev/tty | tr f b。这是给您的提示:它tee解释为/dev/stdoutas文件名。
celtschk 2014年

2
你是对的,我不知道我怎么想念它。我用tty和stdout在自己的shell中进行了一些测试,但我确实以某种方式错过了。感谢您的澄清,我删除了错误的陈述。
文森特·罗伯特

好吧,鉴于stderr不受管道的影响,您将不需要删除它(当然,脚本重定向警告仍然存在,但是对于脚本来说,可重定向性通常是理想的属性)。
celtschk 2014年


3

您可以使用tee命令,只需将其与STDERR文件一起提供即可,例如:

tee /dev/stderr
tee /proc/self/fd/2

因此,在这种情况下,您的别名可能是:

git status --short | \
    cut -b4- | tee /dev/stderr | \
    xargs gvim --remote

1
我认为您的意思是/proc/self/fd/2
celtschk 2014年
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.