cvs注释和标准错误重定向

时间:2015-03-13 17:08:24

标签: perl ksh cvs stderr

首先,一些背景知识。我试图在从ksh命令行调用的Perl脚本中使用cvs annotate,以找出谁在源代码中使用错误的十六进制常量并正确地执行正义。我想严格按照自己的结构化输出使用stdout这个程序,所以我可以把它管道传输到文件或其他程序。但是,每次调用cvs注释都会导致诊断消息被打印到控制台。它采取以下形式:

Annotations for <filename>
***********

它正在破坏我的标准!我在命令行上使用了注释,并且我认为这些诊断消息来自stderr,因为直接在ksh中运行此命令:

cvs annotate <filename> 1>yay.txt 2>boo.txt

正确地将所需的带注释输出放入yay.txt,将诊断放入boo.txt。但是,当我尝试使用反引号在perl脚本中运行它时,事情变得更加棘手。

$muhstring = `cvs annotate $filename 2>boo.txt`;

所需的带注释输出确实出现在$muhstring中,但诊断仍会打印到命令行,boo.txt将创建为空文件。 There's an admittedly old post on perlmonks.org表示此语法应按写入方式工作。那么,这笔交易是什么?这是一个CVS怪癖,我误读了这篇文章,还是自1999年以来发生了变化?还是别的什么?

编辑:所以,事实上,它并没有破坏stdout。我在ksh中试过这个:

perl findbadhexowners.pl badhex.txt > out.txt

并且诊断消息仍然打印到控制台,但out.txt仅包含注释。这对我的目的来说很好,我可以继续使用其他代码。

也就是说,似乎Perl和cvs特别有点奇怪地交互,特别是考虑到ksh中的重定向工作正常并且在Perl 中重定向其他命令cd的工作正常 - 例如,在Perl中

`cd nonexistentDir 1>stdout.txt 2>stderr.txt`;

给出stdout.txt和stderr.txt中的预期输出。它只能在Perl中使用cvs annotate产生此问题。

0 个答案:

没有答案