2010-06-29 124 views
21

我希望将bd命令复制到stderr的标准输出。例如:将stdout复制到stderr

$ echo "FooBar" (...) 
FooBar 
FooBar 
$ 

其中(...)是重定向表达式。那可能吗?

+0

请参阅使用[我怎么能标准输出发送到多个命令?](http://unix.stackexchange.com/questions/28503/how-can-i-send-stdout-to-multiple-commands) – 2015-10-02 13:16:28

回答

41

使用发球为/ dev /标准错误:

echo "FooBar" | tee /dev/stderr 

或用awk/perl的/蟒蛇做手工复制:

echo "FooBar" | awk '{print;print > "/dev/stderr"}' 

echo "FooBar" | perl -pe "print STDERR, $_;" 
+1

在perl示例中的STDERR之后不需要的逗号 – Znik 2014-12-16 11:36:12

+0

这是跨操作系统和跨Shell更便携的吗? 'tee/dev/stderr'或'tee>(cat>&2)'? – 2016-12-18 23:34:57

+0

我打赌后者更具跨平台兼容性,因为如何在每个发行版上不提供'/ dev/stderr'。 – Qix 2017-06-27 00:08:17

0

要重定向到stderr,我会使用>&2>/dev/stderr。为了复制输出,我会使用tee。它的缺点是,临时文件需要:

echo "FooBar" | tee /tmp/stdout >&2 ; cat /tmp/stdout 
+0

错误。您有机会获得大流量并完全填充/ tmp设备,通常连接到/ root文件系统。 – Znik 2014-12-16 11:38:20

+0

@Znik - '/ tmp/stdout'就是一个例子。随意用您的上下文中更适合的文件替换该文件名。 – mouviciel 2014-12-16 13:42:43

9

使用过程换人:http://tldp.org/LDP/abs/html/process-sub.html

echo "FooBar" | tee >(cat >&2)

Tee将文件名作为参数并将输出复制到此文件。通过进程替换,您可以使用进程而不是文件名>(cat),并且可以将此进程的输出重定向到stderr >(cat >&2)

+0

对于没有/ proc文件系统的OS X等操作系统来说,这是一个很好的解决方案。 – Meow 2016-06-09 11:38:13

-1
echo "FooBar" |tee /dev/stderr 
tee: /dev/stderr: Permission denied 

不是在RedHat 6.3

echo "FooBar" | (read A ; echo $A ; echo $A >&2) 

工作

+0

对不起,解释添加;-) – defdefred 2018-03-02 13:48:37