2010-05-25 11 views
10

Busco un ejemplo de redirigir la salida estándar a un archivo usando Perl. Estoy haciendo una herramienta fork/exec bastante sencilla, y quiero redirigir la salida del hijo a un archivo en lugar de a los stdout de los padres.¿Cómo puedo redirigir la salida estándar a un archivo en Perl?

¿Hay un equivilant de dup2() que debo usar? Me parece que no puede encontrarlo

+1

Desde dentro Perl o desde la línea de comandos? que OS? – lexu

+1

ver aquí: http://stackoverflow.com/questions/655719/how-do-i-unalias-from-perls-stdout – lexu

+0

Si es el caso que sólo estás con el objetivo de redirigir la salida de ser el programa 'exec 'ed y nada del proceso hijo hace hasta este punto, entonces esta pregunta no es necesariamente específica de Perl; es una cuestión de redirección de shell o usar cualquier instalación integrada en el programa que está ejecutando cuando lo llame. p.ej. 'exec (" programa> out.txt ");'. – cikkle

Respuesta

27

De perldoc -f abrir:

open STDOUT, '>', "foo.out" 

Los documentos son de su amigo ...

4

El propio niño puede hacer select $filehandle para especificar que la totalidad de su print las llamadas deben dirigirse a un identificador de archivo específico.

Lo mejor que el padre puede hacer es usar system o exec o algo por el estilo de hacer redirección de concha.

3
open my $fh, '>', $file; 
defined(my $pid = fork) or die "fork: $!"; 
if (!$pid) { 
    open STDOUT, '>&', $fh; 

    # do whatever you want 
    ... 

    exit; 
} 
waitpid $pid, 0; 
print $? == 0 ? "ok\n" : "nok\n"; 
+0

método muy agradable, pero por desgracia es imposible retorno contra cualquier texto limitación número porque la función de salida del sistema. – Znik

3

Una estrictamente informativo, pero poco práctico respuesta:

Aunque no hay casi ciertamente una forma más elegante de ir sobre esto dependiendo de los detalles exactos de lo que estamos tratando de hacer, si es absolutamente necesario tener dup2() , su equivalente Perl está presente en el módulo POSIX. Sin embargo, en este caso se está tratando con los descriptores de fichero reales y no filehandles Perl, y en consecuencia está restringido a usar las otras funciones previstas en el módulo de POSIX, todos los cuales son análogos a lo que estaría utilizando en C. Para en cierta medida, estarías escribiendo C en Perl muy poco Perl.

http://perldoc.perl.org/POSIX.html

4

Como dijo JS Bangs, una manera fácil para redirigir la salida es utilizar la instrucción 'seleccionar'.
Muchas gracias a Stackoverflow y sus usuarios. Espero que esto sea útil

por ejemplo:

print "to console\n"; 
open OUTPUT, '>', "foo.txt" or die "Can't create filehandle: $!"; 
select OUTPUT; $| = 1; # make unbuffered 
print "to file\n"; 
print OUTPUT "also to file\n"; 
print STDOUT "to console\n"; 
# close current output file 
close(OUTPUT); 
# reset stdout to be the default file handle 
select STDOUT; 
print "to console"; 
+0

Desafortunadamente, esto solo funciona internamente dentro de la secuencia de comandos de Perl. No redirige la salida para los comandos llamados por la función del sistema. – Znik

Cuestiones relacionadas