Perl STDOUT redirection et retour au défaut.

[Fermé]
Signaler
-
Messages postés
75
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
11 mai 2009
-
Bonjour,

Actuellement je tente de contrôler le "Output" des print de mon programme perl (5.8).

Je fais plusieurs open et open2 (vers d'autre programmes) je veux que certaines de mes sorties de retour(print ou printf) aillent dans un fichier et certaines autres dans le terminal.

Mais voilà, lorsque je renvoie le STDOUT dans un fichier (STDOUT->fdopen) et que je le ferme le STDOUT ce dernier ne revient jamais à sa valeur de défaut (soit dans le terminal).

Les STDOUT->close, STDOUT->flush, STDOUT->untain et autre ne me permettent jamais de revenir à mon STDOUT de départ.

PS> Je code muti-plateforme donc je peux pas programmes mon retour vers un /dev/pty??


Help .

Dave

6 réponses

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 562
Salut,

la fonction select te conviens?
lami20j@debserv:~/trash$ cat ccm.pl
#!/usr/bin/perl
use strict;use warnings;

open FIC,">journal.txt"
     or die "E/S : $!\n";

print "J'écrit sur STDOUT\n";
my $sortie = select(FIC);
print "Hello, j'écrit dans FIC \n";

select($sortie);
print "J'écrit à nouveau sur STDOUT\n";
__END__
l'exécution
lami20j@debserv:~/trash$ perl ccm.pl
J'écrit sur STDOUT
J'écrit à nouveau sur STDOUT
lami20j@debserv:~/trash$ cat journal.txt
Hello, j'écrit dans FIC

Messages postés
75
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
11 mai 2009
56
Ouin,

Marche pas.

L'idée était bonne mais le problème c'est que ça ne fonctionne pas dans les print devant d'un open ou open2

open (ORA, "| sqlplus $p_connect_string") || die ("Can't pipe to sqlplus: $!");
print ORA "set pagesize 0 linesize 1000 feedback off ver off heading off echo on trimspool on termout on\n";
for ($ix = 0; $ix < $z_numArgs; $ix++)
{
my $z_scr_out = $t_obj_a_compiler[$z_counter];
print ORA "spool pof.txt;\n";
print ORA "@ $z_dossier/$z_scr_out\n";
print ORA "spool off;\n";
}

Comme le print est affecté sur un "FILEHANDLER", le select ne le voit pas. Et quand je tente de le re-rediriger bien effectivement il n'aime pas beaucoup ça -> bad interpreter: Fichier texte occupé.

PS Quand même très intéressant cette commande, je ne la connaissais pas.

Dave
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 562
as-tu essayé de faire
close(ORA);
print "maintenant c'est sur stdout\n";
ou écrire sur STDOUT de cette manière
print STDOUT "j'écris sur stdout\n";
?
Messages postés
75
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
11 mai 2009
56
Non car le problème n'est pas avant ou après mais dedans mon open ... c'est que ce sont mes print ORA que je veux rediriger l'affichage de retour vers un fichier.

Le select ou la manipulation du STDOUT semblais un bel avenue mais il y'a quelque chose qui ne marche pas et pourtant ce contrôle devrait être possible.

Je peux pas m'imaginer installer Linux et Windows et voir passer tout les lignes de code à mon écran .. Je m'attend à voir plutôt quelque chose du genre : Installation ..... En cours. Et Voir journal pour toute erreur.

A quand la commande noprint :-(

Une autre idée.?

Dave
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 562
Salut,

A quand la commande noprint :-(
Ben, il n'y a pas besoin ;-))
Quand on veut afficher on utilise print et quand on ne veux pas alors on ne l'utilise pas ;-DD

Bon, revenons à ton problème.

J'aimerai bien que tu me dit quand tu veux écrire sur STDOUT et quand tu veux écrire dans ORA, puisque je ne suis pas sûr d'avoir compris ce que tu veux.
Messages postés
75
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
11 mai 2009
56
Merci de ton aide.

Ok voici un explication avec exemple concrète.

Je reprend en exemple la partie de code suivant:

open (ORA, "| sqlplus $p_connect_string") || die ("Can't pipe to sqlplus: $!");
print ORA "set pagesize 0 linesize 1000 feedback off ver off heading off echo on trimspool on termout on\n";
for ($ix = 0; $ix < $z_numArgs; $ix++)
{
my $z_scr_out = $t_obj_a_compiler[$z_counter];
print ORA "spool pof.txt;\n";
print ORA "@ $z_dossier/$z_scr_out\n";
print ORA "spool off;\n";
}
Close(ORA);

La commande print est utilisé dans le cas présent afin d'envoyer des commande au programme sqlplus à travers le open.
Ces commandes je ne les voies pas à l'affichage et cette partie fonctionne bien.

Le programme sqlplus retourne par contre par lui même du OUTPUT (au terminal). Ce OUTPUT qui vient du programme, je veux le capturer et le renvoyer vers un fichier, c'est pourquoi que je pensais que la commande STDOUT->fdopen(\*OUTPUT, "w"); était un bon choix (Mais je ne peux revenir par la suite à mon terminal (ou à l'état initiale de STDOUT)).


Je veux que le client voit ceci à son écran:
Resultat de la compilation
Module Programme Status
========== ============================================= ========
sql vi_usage_tol.sql OK

Mais pour le moment il reçoit:
Resultat de la compilation
Module Programme Status
========== ============================================= ========

SQL*Plus: Release 10.1.0.5.0 - Production on Lun. Nov. 26 12:00:23 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connecté à :
Oracle Database 10g Release 10.2.0.3.0 - Production
SQL> SQL> SQL> SQL> -- Vue qui regroupe les informations des usages d'imputations
SQL> --
bla bla bla bla bla
SQL> SQL> sql vi_usage_tol.sql OK

Donc Je cherche un moyen de conserver ces messages mais pas les avoir dans mon afficheur.
Bref "trip de pouvoir" je veux tout géré ce qui vient à mon écran et décider ou ça s'en va.


Dave
Messages postés
75
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
11 mai 2009
56
J'ai trouvé!!

# Saving STDOUT
open(OLDOUT,">&STDOUT") || die("[$PROGNAME] Couldn't dup STDOUT\n"); # <- Sauvegarder l'origine du STDOUT
# Redirecting STDOUT to file
close(STDOUT); # Fermeture du STDOUT actuel
open(STDOUT,">perl.out"); # Redirection du STDOUT vers un journal (log)
print "CMD: $cmd\n"; # Tous les print ou retour vons dans le journal
# Restore STDOUT
close(STDOUT); # On referme le STDOUT
open(STDOUT,">&OLDOUT"); # On récupère le terminal d'origine (Bref on retourne à l'écran)

Bref avec cela il est possible contrôler à souhait et aussi souvent que l'on veut l'affichage du programme perl.

Référence: https://board.issociate.de/thread/142703/

Merci pour l'aide.

Dave.