2013-11-29 3 views
2

Так у меня есть:Изнутри скрипта perl вы можете узнать имя файла, на который вы перенаправляете вывод?

test.pl > test.log 

есть способ узнать внутри test.pl что я outputing к «test.log»? В конце моего сценария я хочу сделать некоторые манипуляции с test.log без жесткого кодирования имени.

+1

Боюсь, вы не можете знать. – Toto

+0

Рассмотрите возможность написания отдельного сценария для обработки после вывода, например. 'test.pl | postprocess> test.log' или 'test.pl> test.log && postprocess test.log'. –

+0

@Aaron Miller. Это не работает, если скрипт принимает переменное количество ввода, и в этом случае традиционно используется '-o'. – ikegami

ответ

3

Вы можете перенаправить стандартный вывод из Perl, с минимальными изменениями в вашем сценарии,

test.pl test.log 

my ($file) = @ARGV; 
if (@ARGV) { 
    open STDOUT, ">", $file or die $!; 
} 

print "output is redirected to $file\n"; 

# use $file at the end 
+0

Есть ли необходимость закрыть STDOUT в конце? это хорошая практика? – Bill

+0

@ Не нужно делать это –

+1

Должно быть 'if (@ARGV) {($ file) = @ARGV; ...} ', иначе я не могу использовать файл с именем' 0' (ноль). – amon

5

Может быть. Следующие работы на Linux, но не очень подходит для других систем ...

#!/usr/bin/env perl 

use strict; 
use warnings; 

my $out = readlink("/proc/$$/fd/1"); 
print STDERR "I am being output to $out\n"; 

Естественно, это, вероятно, плохая идея. Лучше явно открыть файл и записать его в Perl, вместо того, чтобы настроить перенастройку оболочки.

+0

Вы также можете получить вывод скрипта в файл, если он получает аргумент имени файла и в противном случае выводит его на stdout; таким образом, как 'test.pl test.log', так и' test.pl> test.log' будут вести себя так, как предполагалось, хотя, конечно, в последнем случае скрипт не сможет узнать, куда идет его выход. (Но это возможно только среди законных проблем test.pl в любом случае.) –

Смежные вопросы