在将STDOUT传送到文件时捕获STDERR的输出

Bar*_*t B 2 perl

我有一个相当奇怪的情况.我正在尝试使用Perl自动备份SVN存储库集合.我正在炮轰svnadmin dump命令,该命令将转储发送到STDOUT,以及遇到STDERR的任何错误.

我需要运行的命令将采用以下形式:

svnadmin dump $repo -q >$backupFile
Run Code Online (Sandbox Code Playgroud)

STDOUT将转到备份文件,但是,我需要在我的Perl脚本中捕获STDERR.

处理这种情况的正确方法是什么?

编辑:澄清:STDOUT将包含SVN转储数据STDERR将包含可能发生的任何错误

STDOUT需要以文件结尾,而STDERR需要以Perl结尾.在任何情况下都没有任何东西,但STDOUT的原始内容最终会在该流中或转储将被破坏,我会有比没有备份更坏的东西,一个糟糕的!

Wes*_*ker 7

好吧,在perl中也有通用的方法,但是bash解决方案(上面让我认为你正在寻找)是将stderr 首先重定向到stdout,然后将stdout重定向到文件.直觉上,在看到内部发生的事情发生之前,这并没有多大意义.但这有效:

svnadmin dump $repo -q 2>&1 >$backupFile
Run Code Online (Sandbox Code Playgroud)

不过,千万不能做它的其他方式(即,将2>&1日结束),或者两者输出和错误的所有输出将转到您的文件.

编辑,以避免一些人的混淆,这不起作用:

你想要的是这个:

# perl -e 'print STDERR "foo\n"; print "bar\n";' 2>&1 > /tmp/f 
foo
# cat /tmp/f
bar
Run Code Online (Sandbox Code Playgroud)

特别是你不想要这个:

# perl -e 'print STDERR "foo\n"; print "bar\n";' > /tmp/f 2>&1
# cat /tmp/f
foo
bar
Run Code Online (Sandbox Code Playgroud)

  • 有关您可以尝试的示例,请参阅更新. (2认同)