找到perl程序的标准

时间:2014-04-08 13:16:24

标签: perl

我正在为perl程序重定向标准。例如:

perl run_program.pl > /log/run_program.log

有没有办法知道标准是什么。所以在这种情况下,我希望得到'/log/run_program.log'的值。

如果不可能有另一种/更好的方法来获得相同的结果?

提前致谢!

编辑:我没有在程序中设置STDOUT的原因是因为我正在调用一堆.pm,它有打印行我想要去STDOUT而不必将文件传递给它。

5 个答案:

答案 0 :(得分:3)

在我的系统上,您可以使用

readlink("/proc/$$/fd/1")

答案 1 :(得分:2)

  编辑:我没有在程序中设置STDOUT的原因是因为我正在调用一堆.pm,它有打印行,我想转到STDOUT而不必将文件传递给它

只是为了通知您,您可以使用select命令重新定义FD以获取默认输出:

use strict;
use warnings;
use autodie;

open my $output_fd, ">", "/log/run_program.log";

my $old_default_fd = select( $output_fd );

print "I'm now going into /log/run_program.log\n";

select ($old_default_fd;   # Restore the default when you no longer need it

这可能适用于大多数Perl模块。只是希望他们不会像以下那样愚蠢:

 print STDOUT "Ha, ha. I'm still going to STDOUT.\n".

当Perl模块打印东西时,我讨厌它。

<soapbox>

给你的Perl模块编写者:

Perl模块不应该打印(除非这是他们的主要目的)。您应该返回要打印的内容,让调用者决定如何处理输出。

</soapbox>

答案 2 :(得分:0)

对于你问题的第一部分,没有。 perl程序无法知道STDOUT的指向。

重定向发生在程序外部,并在perl进程开始之前“连线”。 STDOUT可以指向设备,文件或其他进程(管道)。

答案 3 :(得分:0)

从stdout重定向到文件的整个目的是调整通常写入stdout并将其重定向到文件的程序。操作系统没有为您提供文件的名称,因为它表明您的程序太愚蠢,无法知道如何处理文件名。

所以你最好的选择是自己my $file_name = shift;open。 (主线中的shift来自@ARGV。)

答案 4 :(得分:0)

给这个想法一个机会:

...
my $log_path = "/log/run_program.log"; # or using $0 in some manner
open $log_handler, "<", $log_path or die;
...

现在你可以编写一个myprint子程序来调用print $log_handler并将其用于整个程序,或者更好,看看OVERRIDING CORE FUNCTIONS你可以自我重新定义{{1}这样做:

print