我正在为perl程序重定向标准。例如:
perl run_program.pl > /log/run_program.log
有没有办法知道标准是什么。所以在这种情况下,我希望得到'/log/run_program.log'的值。
如果不可能有另一种/更好的方法来获得相同的结果?
提前致谢!
编辑:我没有在程序中设置STDOUT的原因是因为我正在调用一堆.pm,它有打印行我想要去STDOUT而不必将文件传递给它。答案 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