2010-05-25 6 views
10

Je cherche un exemple de redirection de stdout vers un fichier en utilisant Perl. Je fais un outil fork/exec assez simple, et je veux rediriger la sortie de l'enfant vers un fichier au lieu de la sortie standard des parents.Comment puis-je rediriger la sortie standard vers un fichier en Perl?

Y a-t-il un équivalent de dup2() que je devrais utiliser? Je ne peux pas sembler trouver

+1

A partir de l'intérieur de Perl ou de la ligne de commande? quel OS? – lexu

+1

voir ici: http://stackoverflow.com/questions/655719/how-do-i-unalias-from-perls-stdout – lexu

+0

Si c'est le cas que vous visez simplement à rediriger la sortie du programme étant 'exec 'ed et rien de ce que le processus fils fait jusqu'ici, alors cette question n'est pas nécessairement spécifique à Perl; c'est une question de redirection de shell ou d'utilisation de toutes les facilités intégrées dans le programme que vous devez exécuter lorsque vous l'appelez. par exemple. 'exec (" programme> out.txt ");'. – cikkle

Répondre

27

De perldoc -f ouvrir:

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

Les documents sont à votre ami ...

4

L'enfant lui-même peut faire select $filehandle de préciser que toutes ses print les appels doivent être dirigés vers un descripteur de fichier spécifique. Le meilleur que le parent peut faire est d'utiliser system ou exec ou quelque chose du genre pour faire la redirection de shell.

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

très belle méthode, mais malheureusement, il est impossible de retourner n'importe quel texte contre le numéro parce que la fonction de sortie du système de limitation. – Znik

3

Une réponse strictement informatif mais peu pratique:

Bien qu'il y ait certainement une façon plus élégante d'aller sur ce selon les détails exacts de ce que vous essayez de faire, si vous devez absolument avoir dup2() , son équivalent Perl est présent dans le module POSIX. Cependant, dans ce cas, vous avez affaire à des descripteurs de fichiers réels et pas à des handles de fichiers Perl, et par conséquent vous êtes limité à utiliser les autres fonctions fournies dans le module POSIX, qui sont toutes analogues à celles que vous utiliseriez en C. Dans une certaine mesure, vous écririez C dans Perl très Perlish.

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

4

Comme JS Bangs a dit, un moyen facile de rediriger la sortie est d'utiliser l'instruction 'select'.
Un grand merci à stackoverflow et à ses utilisateurs. J'espère que cela est utile

par exemple:

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

Malheureusement cela ne fonctionne qu'en interne dans le script Perl. Il ne redirige pas la sortie pour les commandes appelées par la fonction système. – Znik

Questions connexes