分别将stdout和stderr同时记录在一起

时间:2014-02-07 19:55:48

标签: perl bash terminal stdout stderr

我有一个我想要解决的具体问题,我正在system通过perl运行,我认为这是bash

  1. stdout中显示stderrboth.log。如果完成,添加“完成”。
  2. stderr
  3. 中附加 stderr.log
  4. 除了原始命令外,不要打印到终端,如果命令完成,则不打印到“完成”。
  5. 因此,一旦我们合并stdoutstderr,我们可以再次将它们分开吗?或者,我们可以首先捕获stderr然后将其与stdout结合起来吗?

2 个答案:

答案 0 :(得分:0)

仅仅{p> tcsh就不够了。它不支持在没有标准输出的情况下重定向stderr。

使用另一个shell或指定的脚本。

更多here


<强>更新

  

这可以移植到tcsh吗?

没有。 tcsh不支持在没有标准输出的情况下重定向stderr。

答案 1 :(得分:0)

bash:system("((" . $cmd . " 2>&1 1>&3 | tee -a stderr.log) 3>&1) > both.log; echo done | tee -a both.log"

即使我们对tee使用stderr.log,它也不会tee错误输出到终端(这就是我想要的)。我不完全理解它是如何工作的,但我想tee会导致它转到日志文件,也会转到下一个文件描述符等式。


<强>加成

我在评论中发现了这一点:http://wiki.bash-hackers.org/howto/redirection_tutorial 这可以用来做同样的事情,但所有输出也是tee到终端(它不打印“完成”)。

bash下 (($command 2>&1 1>&3 | tee stderr.log) 3>&1 ) | tee both.log


使用Perl 5.14.1。