2010-07-27 11 views
8

Aus Neugier, ist es möglich, zusätzliche Ausgabepuffer außer STDOUT und STDERR innerhalb eines Perl-Skripts zu erstellen, instanziieren oder anderweitig darauf zuzugreifen?Linux/Perl: Zusätzliche Ausgabepuffer außer STDOUT und STDERR?

Der Anwendungsfall würde zusätzliche Ausgänge, um Dateien oder andere Befehle Rohr sein, zB ./doublerainbow.pl 3>full_on.txt 4>all_the_way!.txt

Antwort

12

Absolut. Mit dem Befehl open mit dem Modus >&= können Sie Dateihandles für beliebige Dateideskriptoren öffnen.

# perl 4fd.pl > file1 2> file2 3> file3 4> file4 5< file5 

open STDFOO, '>&=3'; 
open STDBAR, '>&=4'; 
open STDBAZ, '<&=5'; # works for input handles, too 

print STDOUT "hello\n"; 
print STDERR "world\n"; 
print STDFOO "42\n"; 
print STDBAR <STDBAZ>; 

$ echo pppbbbttt > file5 
$ perl 4fd.pl >file1 2>file2 3>file3 4>file4 5<file5 
$ cat file1 
hello 
$ cat file3 
42 
$ cat file4 file2 
pppbbbttt 
world 
+5

Natürlich, wenn Sie um Griffe Aufruf gehen 'STDFOO' es irgendwie die ganze "std" Ding verbilligt. :) – hobbs

+0

Hobbs ist richtig, aber ich denke, mobrule versuchte darauf hinzuweisen, dass STDOUT und STDERR sind nur Synonyme für die Ausgabe auf fd1 und fd2 aus der Box, aber auch das kann geändert werden, es ist nicht ungewöhnlich in einem Skript Punkt STDERR zu einem anderen fd für eine Datei, die zum Schreiben geöffnet wurde. – mikegrb

+0

'> &' 'dup's (erstellt einen neuen Dateideskriptor) und erstellt ein Perl-Dateihandle aus dem neuen Dateideskriptor. Sie sollten '> & =' verwenden, um ein Perl-Handle für den vorhandenen Dateideskriptor zu erstellen. Fest. – ikegami