Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ecrire un log avec nom similaire au STDOUT (choisi par l'usager)

5 réponses
Avatar
Patrick
Bonjour,

j'ai un pgm Perl tout simple que l'usager peut appeller avec quelques
arguments, tout en dirigeant les resultats vers le fichier d'output de
son choix.
S'il tape:

MonProgramme.pl arg1 arg2 arg3 > MonResultat.txt

j'aimerais bien, dans mon pgm Perl, "comprendre" ou l'usager
veut sauvegarder son output et lui creer un log dans le meme repertoire
et sous un nom se rapprochant, a savoir: MonResultat.log
(log qui contiendra quelques messages pas tjrs d'interet national!)

Y a-t-il moyen, en Perl, de "capturer" le nom du fichier ou sera envoye
le STDOUT?

A l'avance merci!

Patrick

5 réponses

Avatar
Jérémy JUST
On 5 Jul 2005 14:15:51 -0700
"Patrick" wrote:

Y a-t-il moyen, en Perl, de "capturer" le nom du fichier ou sera
envoye le STDOUT?


A priori non, puisque c'est le shell qui s'occupe du branchement.

Une solution serait d'avoir une option « -o MonResultat.txt » au lieu
d'utiliser la redirection par le shell.


--
Jérémy JUST

Avatar
Paul Gaborit
À (at) 5 Jul 2005 14:15:51 -0700,
"Patrick" écrivait (wrote):
j'ai un pgm Perl tout simple que l'usager peut appeller avec quelques
arguments, tout en dirigeant les resultats vers le fichier d'output de
son choix.
S'il tape:

MonProgramme.pl arg1 arg2 arg3 > MonResultat.txt

j'aimerais bien, dans mon pgm Perl, "comprendre" ou l'usager
veut sauvegarder son output et lui creer un log dans le meme repertoire
et sous un nom se rapprochant, a savoir: MonResultat.log
(log qui contiendra quelques messages pas tjrs d'interet national!)

Y a-t-il moyen, en Perl, de "capturer" le nom du fichier ou sera envoye
le STDOUT?



Ce n'est pas possible tout simplement parce que vous n'avez aucun moyen de
savoir ce qu'est vraiment STDOUT. L'utilisateur peut faire :

MonProgramme.pl > /dev/null

Allez-vous créer un fichier dans le répertoire /dev ?

MonProgramme.pl | more

Et là, où comptez-vous créer le fichier de log ? Et sous quel nom ?

Et si le fichier "MonResultat.txt" est en fait un lien ou pipe...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
DoMinix
Bonjour,

j'ai un pgm Perl tout simple que l'usager peut appeller avec quelques
arguments, tout en dirigeant les resultats vers le fichier d'output de
son choix.
S'il tape:

MonProgramme.pl arg1 arg2 arg3 > MonResultat.txt

j'aimerais bien, dans mon pgm Perl, "comprendre" ou l'usager
veut sauvegarder son output et lui creer un log dans le meme repertoire
et sous un nom se rapprochant, a savoir: MonResultat.log
(log qui contiendra quelques messages pas tjrs d'interet national!)

Y a-t-il moyen, en Perl, de "capturer" le nom du fichier ou sera envoye
le STDOUT?

A l'avance merci!

Patrick



c'est plus du perl mais bon ... une alternative :
tu peut envoyer ton log sur STDERR et l'usager n'aura qu'a taper
moscript.pl arg arg >monresult 2>monlog


--
dominix

Avatar
Jérémy JUST
On Wed, 06 Jul 2005 00:58:06 +0200
Paul Gaborit wrote:

Ce n'est pas possible tout simplement parce que vous n'avez aucun
moyen de savoir ce qu'est vraiment STDOUT.


J'ai répondu la même chose, mais c'est faux. Le programme n'est pas au
courant, mais il peut le demander à l'OS (ça veut dire que ça ne sera
pas portable).


Par exemple sous Linux, il suffit d'aller regarder dans /proc/PID/fd
(où PID est le numéro du processus). Ce répertoire contient un lien
symboliques par descripteur de fichier (0, 1 et 2 étant STDIN, STDOUT
et STDERR).
Par exemple:

$ perl -e 'print STDERR `ls -la /proc/$$/fd/` ' > /tmp/toto
total 0
dr-x------ 2 jejust jejust 0 jui 8 21:49 .
dr-xr-xr-x 3 jejust jejust 0 jui 8 21:49 ..
lrwx------ 1 jejust jejust 64 jui 8 21:49 0 -> /dev/pts/4
l-wx------ 1 jejust jejust 64 jui 8 21:49 1 -> /tmp/toto
lrwx------ 1 jejust jejust 64 jui 8 21:49 2 -> /dev/pts/4
lr-x------ 1 jejust jejust 64 jui 8 21:49 3 -> pipe:[45878]
$


MonProgramme.pl | more


Dans ce cas, on voit un lien symbolique vers « pipe:[45776] ». Je n'ai
pas cherché si c'était utilisable.


--
Jérémy JUST

Avatar
Paul Gaborit
À (at) Fri, 8 Jul 2005 21:51:26 +0200,
Jérémy JUST écrivait (wrote):
On Wed, 06 Jul 2005 00:58:06 +0200
Paul Gaborit wrote:

Ce n'est pas possible tout simplement parce que vous n'avez aucun
moyen de savoir ce qu'est vraiment STDOUT.


J'ai répondu la même chose, mais c'est faux. Le programme n'est pas au
courant, mais il peut le demander à l'OS (ça veut dire que ça ne sera
pas portable).


[...des exemples de contenu de /proc sous linux...]

Outre le fait que c'est effectivement dépendant de l'OS, ça ner
servira pas à grand chose à mon avis... Dans le cas suivant par
exemple :

MonProg.pl | rsh unautremachine "...."

Là, le fichier final (si il existe) est sur une autre machine !!!

Tout ça pour dire que ce n'est certainement pas une bonne piste
d'essayer de savoir (automatiquement) ce vers quoi envoie STDOUT.

En fait, plutôt que de demander à l'OS, le plus fiable est de le
demander à l'utilisateur. Lui sait ce qu'il veut faire. Le meilleur
moment pour lui demander ce n'est pas lorsque le programme tourne déjà
mais juste à son lancement, par exemple, via une option de la ligne de
commande. Et on en revient aux solutions initiales...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>