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

Redirections sans shell

6 réponses
Avatar
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.

6 réponses

Avatar
Thomas vO
salut,


À (at) Thu, 22 Jan 2009 14:27:28 +0100 (CET),
mpg <mpg+ nous disait (told us):
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 - <http://perso.enstimac.fr/~vanouden/>
Avatar
Joseph
> 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
Avatar
Patrice Karatchentzeff
mpg <mpg+ a écrit :

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
    '---''(_/--'  `-'_)       
Avatar
Patrice Karatchentzeff
Patrice Karatchentzeff a écrit :

mpg <mpg+ a écrit :



[...]

> 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
    '---''(_/--'  `-'_)       
Avatar
Paul Gaborit
À (at) Thu, 22 Jan 2009 14:27:28 +0100 (CET),
mpg <mpg+ écrivait (wrote):
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 - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>
Avatar
Olivier Croquette
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 !