我想将命令的stdout复制到stderr以及bash下。类似的东西:
$ echo "FooBar" (...)
FooBar
FooBar
$
其中(...)是重定向表达式。这可能吗?
答案 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