Bash 将标准输出复制到标准输出

Bash 将标准输出复制到标准输出,bash,redirect,Bash,Redirect,我希望在bash下将命令的stdout复制到stderr。比如: $ echo "FooBar" (...) FooBar FooBar $ 其中(…)是重定向表达式。这可能吗?对于重定向到stderr,我将使用&2或/dev/stderr。对于复制输出,我将使用tee。它的缺点是需要一个临时文件: echo "FooBar" | tee /tmp/stdout >&2 ; cat /tmp/stdout 将tee与/dev/stderr一起使用: echo "FooBar"

我希望在bash下将命令的stdout复制到stderr。比如:

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

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

对于重定向到stderr,我将使用
&2
/dev/stderr
。对于复制输出,我将使用
tee
。它的缺点是需要一个临时文件:

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

将tee与/dev/stderr一起使用:

echo "FooBar" | tee /dev/stderr
或者使用awk/perl/python手动执行复制:

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

echo "FooBar" | perl -pe "print STDERR, $_;"
使用过程替换:

echo“FooBar”| tee>(cat>&2)

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

不使用RedHat 6.3

echo "FooBar" | ( read A ; echo $A ; echo $A >&2)
正在工作

如果我可以展开,对于我正在使用的多行

my_commmand | while read line; do echo $line; echo $line >&2; done

它的“优点”是不需要/调用
tee
和使用内置程序。

在perl示例中,STDERR后面不需要逗号,这在操作系统和shell之间更容易移植
tee/dev/stderr
tee>(cat>&2)
?我敢打赌后者更具跨平台兼容性,因为
/dev/stderr
并非在每个发行版上都可用。错误。您有机会获得大流量并完全填充/tmp设备,通常连接到/root文件系统。@Znik-
/tmp/stdout
就是一个例子。请随意将该文件名替换为在您的上下文中更合适的文件名。请参阅,这是一个很好的解决方案,适用于操作系统,如OS X,它没有/proc文件系统。这比依赖/dev/stderr要好,因为它可能不可写,如defdefred所示。在许多操作系统上,您甚至可能不需要使用
cat
。(即
echo“FooBar”| tee>(>&2)
)抱歉,添加了解释;-)
my_commmand | while read line; do echo $line; echo $line >&2; done