将perl脚本的所有输出复制到文件中

aze*_*ole 1 perl

我想将我的Perl脚本的stdout和stderr复制到一个文件中,同时也将它保留在屏幕上,并且最好在脚本本身内部使用一些技巧.即我想要类似的东西

./test.pl 2>&1 | tee foo.bar

但隐藏在perl脚本实现中.目前我刚刚编写了一个子程序,可以在屏幕上和文件句柄上打印所有消息,但缺点是如果脚本死掉,则消息将不会出现在日志中.有办法吗?

DVK*_*DVK 7

请参阅Perl食谱中的"13.15.9.绑定示例:多个接收文件句柄"部分.

要知道的主要是 tie *TEE, "Tie::Tee", @handles;

注意:Tie :: Tee包是您需要自己创建的,代码在本书的相同部分.

注意:您可以这样做select(TEE),它将在每个常规print语句中使用,因此您不需要这样做print TEE xxx.

注意:要使任何STDERRy输出(包括die)转到相同的文件句柄,请将STDERR更改为TEE,如下所示:

use Tie::Tee; 
use Symbol; 
@handles = (*STDOUT); 
push(@handles, $handle = gensym( )); 
open($handle, ">/tmp/teetest.xxx"); 
tie *TEE, "Tie::Tee", @handles; 
select(TEE); 
*STDERR = *TEE; 
print "raw print\n"; 
die "XXXX\n";
Run Code Online (Sandbox Code Playgroud)

输出将是:

raw print
XXXX
Run Code Online (Sandbox Code Playgroud)

文件内容如下:

raw print
XXXX
Run Code Online (Sandbox Code Playgroud)