Bash 将标准输出复制到标准输出
我希望在bash下将命令的stdout复制到stderr。比如: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"
$ 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