Redirections sans shell

Le
mpg
Bonjour,

Y a-t-il moyen de lancer des processus en redirigeant leur sortie
(standard ou d'erreur) vers ce qu'on veut (fichier, variables, ) sans
passer par le shell système ? C'est-à-dire autre que

system("cmd >out 2>err");
$var = `cmd`;

L'idée est à la fois que c'est pénible de passer par un shell à cause
des arguments et caractères spéciaux à protéger, et que, bah pour le
principe, ça me paraît bizarre de pas savoir le faire directement en
Perl.

À la rigueur, si ce n'est pas portable (genre pas sur windows), ça ne me
dérange pas trop.

Je ne sais pas trop quels mots-clé utiliser pour cherche dans la
documenbtation ou sur le CPAN.

Merci,
Manuel.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Thomas vO
Le #18456301
salut,


À (at) Thu, 22 Jan 2009 14:27:28 +0100 (CET),
mpg
Y a-t-il moyen de lancer des processus en redirigeant leur sortie
(standard ou d'erreur) vers ce qu'on veut (fichier, variables, ...) sans
passer par le shell système ?



je m'étais jamais posé la question, mais voilà jusqu'ou je s uis
remonté :

perldoc -f system finit par :

See "‘STRING‘" in perlop and "exec" for details.


et dans perldoc perlop (en cherchant `STRING`), on finit par trouver :

The STDIN filehandle used by the command is inherited from Perl†™s
STDIN.

ainsi, peut-être qu'il en est de même pour STDOUT ou STDERR (pas testé)

--
Thomas vO -
Joseph
Le #18456291
> Y a-t-il moyen de lancer des processus en redirigeant leur sortie
(standard ou d'erreur) vers ce qu'on veut (fichier, variables, ...) sans
passer par le shell système ?



Voir un des modules suivant :
IPC::Open2
IPC::Open3
IPC::Run
ou même POE::Wheel::Run ;)

--
jogo
Patrice Karatchentzeff
Le #18456621
mpg
Y a-t-il moyen de lancer des processus en redirigeant leur sortie
(standard ou d'erreur) vers ce qu'on veut (fichier, variables, ...) sans
passer par le shell système ? C'est-à-dire autre que

system("cmd >out 2>err");
$var = `cmd`;

L'idée est à la fois que c'est pénible de passer par un shell à cause
des arguments et caractères spéciaux à protéger, et que, bah pour le
principe, ça me paraît bizarre de pas savoir le faire directement en
Perl.

À la rigueur, si ce n'est pas portable (genre pas sur windows), ça ne me
dérange pas trop.

Je ne sais pas trop quels mots-clé utiliser pour cherche dans la
documenbtation ou sur le CPAN.



% perldoc -f open

open($log, "| cmd) etc.

PK

--
      |      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:
     |,4-  ) )-,_. , (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'_)       
Patrice Karatchentzeff
Le #18456611
Patrice Karatchentzeff
mpg


[...]

> Je ne sais pas trop quels mots-clé utiliser pour cherche dans la
> documenbtation ou sur le CPAN.

% perldoc -f open



Un bon article sur le sujet :

http://articles.mongueurs.net/magazines/linuxmag55.html

PK

--
      |      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:
     |,4-  ) )-,_. , (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'_)       
Paul Gaborit
Le #18457351
À (at) Thu, 22 Jan 2009 14:27:28 +0100 (CET),
mpg
Bonjour,

Y a-t-il moyen de lancer des processus en redirigeant leur sortie
(standard ou d'erreur) vers ce qu'on veut (fichier, variables, ...) sans
passer par le shell système ? C'est-à-dire autre que

system("cmd >out 2>err");
$var = `cmd`;

L'idée est à la fois que c'est pénible de passer par un shell à cause
des arguments et caractères spéciaux à protéger, et que, bah pour le
principe, ça me paraît bizarre de pas savoir le faire directement en
Perl.

À la rigueur, si ce n'est pas portable (genre pas sur windows), ça ne me
dérange pas trop.

Je ne sais pas trop quels mots-clé utiliser pour cherche dans la
documenbtation ou sur le CPAN.



Pour la documentation, la doc de la fonction 'open' et la doc
'perlipc' sont un bon début. Il y a aussi des choses dans la faq
('perldoc -q daemon' et d'autres...). Et il y a aussi pas mal de
modules (qui répondent chacun à des besoins précis) comme
Proc::Daemon, Parallel::Jobs ou IPC::Open3 entre autres...

En fait, il faut bien comprendre ce qu'on fait lorsqu'on passe par
'system' ou les backticks, qu'on utilise le shell et ses redirections,
et reproduire tout cela 'à la main' via Perl. Sur le principe, c'est
asses simple (en gros, on n'utilise des 'fork', des 'exec' et de la
(ré)ouverture de flux) mais il est courant d'oublier quelques
paramètres de l'équation...

Mais pour qui veut gérer la sécurité et la fiabilité de son soft, il
est indispensable de maîtriser tout cela et d'éviter comme la peste le
passage par le 'shell'.

--
Paul Gaborit - Perl en français -
Olivier Croquette
Le #18479901
Joseph wrote, On 22/01/09 14:51:
Y a-t-il moyen de lancer des processus en redirigeant leur sortie
(standard ou d'erreur) vers ce qu'on veut (fichier, variables, ...) sans
passer par le shell système ?



IPC::Run



Je recommande IPC::Run !
Publicité
Poster une réponse
Anonyme