我在这里做错了什么?我没有从STDOUT
得到任何tee
,但是test.log
的填充正确。
perl test.pl | tee -i | sed 's/\x1b\[[0-9;]*m//g' > test.log
我的目标是将test.pl
打印的所有内容发送到STDOUT
,然后将过滤后的版本(使用sed
)转储到test.log
答案 0 :(得分:2)
澄清后:
Daniel Schelper的解决方案是在普通的人类可用外壳上正确的解决方案(谷歌为何永远不使用csh)。不幸的是,有时我们别无选择,所以有一个解决方案:
perl test.pl | tee /dev/stderr | sed 's/\x1b\[[0-9;]*m//g' > test.log
此操作是将stdout
复制到stderr
,并且仅将stdout
前移。 perl
的输出将显示在屏幕上(通过stderr
)。这有一个明显的警告,即任何真实的错误都可能被隐藏。一个更安全的解决方案可能是:
perl test.pl > /tmp/temp.log; cat /tmp/tmp.log & sed 's/\x1b\[[0-9;]*m//g' /tmp/tmp.log
这当然会产生一个额外的文件。与Bourne shell相比,csh的良好选择通常涉及更多的中间文件。
旧答案
tee
应该始终是最后一个管道程序(除非我想中途记录某些东西),并且必须使用文件名作为参数。前者是因为重点是要在屏幕上看到输出(而不是将其传递),其二是因为tee在不将输出也发送到文件时通常没有用。
就目前而言,您正在将stdout
通过tee
传递到下一个管道sed
,并且正在将所有内容与{{1}一起转储到test.log
中}运算符。实际上,您不应同时拥有>
和>
:
tee
在屏幕上和日志中获取perl test.pl | sed 's/\x1b\[[0-9;]*m//g' | tee test.log
的结果。如果我误会了,而实际上您确实想使用tee记录结果
sed
答案 1 :(得分:1)
这可能对您有用:
perl test.pl | tee -i /dev/stderr | sed -f sed.sed > test.log
perl程序会将其输出泵送到stdout。发球台将把标准输出并接受为标准输入并将其抽出到标准错误和标准输出。 sed程序将把stdout接受为stdin并将其抽出stdout,将其重定向到test.log
。 stderr将被定向到终端。
这可能会引起不良的副作用。
答案 2 :(得分:0)
如果您使用的是Bash,即脚本的Posix遵从性并不重要,则可以使用process substitution:
perl test.pl | tee >(sed 's/\x1b\[[0-9;]*m//g' > test.log)