首先,一些背景知识。我试图在从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
产生此问题。