将stdout复制到stderr

时间:2010-06-29 14:39:38

标签: bash redirect

我想将命令的stdout复制到stderr以及bash下。类似的东西:

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

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

4 个答案:

答案 0 :(得分:44)

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

echo "FooBar" | tee /dev/stderr

或使用awk / perl / python手动执行复制:

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

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

答案 1 :(得分:14)

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

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

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

答案 2 :(得分:1)

如果我可以扩展@defdefred's answer,我正在使用多行

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

它具有不需要/调用tee和使用内置函数的“优势”。

答案 3 :(得分:0)

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

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