2010-09-17 24 views
2

J'utilise IPC::System::Simple:runx pour exécuter des commandes système et mourir sur des valeurs de retour inattendues. Le problème est que la sortie des commandes est imprimée sur le shell.Comment éviter d'imprimer sur STDOUT en utilisant `IPC :: System :: Simple: runx` de Perl?

  1. Comment puis-je éviter d'imprimer cette sortie ?
  2. Comment puis-je éviter d'imprimer cette sortie mais de la placer dans une variable perl?

MISE À JOUR

3) Comment puis-je imprimer cette sortie ssi l'exécution échoue?

Répondre

2

La commande capture()? Ou capturex().

Tiré du lien:

Gestion des exceptions

Dans le cas où jetteront une exception, qui sinon pris la commande retourne un état inattendu, à la fois l'exécution et la capture mettra fin à votre programme avec un Erreur.

Capturer l'exception est facile:

eval { 
    run("cat *.txt"); 
}; 

if ([email protected]) { 
    print "Something went wrong - [email protected]\n"; 
} 

Voir la section de diagnostic ci-dessous pour plus de détails.

+0

Merci, mais est 'capture' identique à' runx' en ce que pour la phase d'exécution (le SCPS dit que 'catpure' fonctionne comme' run' alors que des contre-apostrophes fonctionne comme 'installation privée)? Puis-je imprimer ce qui a été capturé uniquement en cas d'échec? –

+0

Voir la modification que je viens de faire. – colithium

+0

Merci. Apparemment, 'capturex' fait par défaut exactement ce que je veux: si tout se passe bien, il est silencieux, si une erreur survient, il meurt mais imprime d'abord la sortie de la commande avec son propre message. Génial! –

0

Si un module se comporte très mal et imprime directement dans STDOUT, vous pouvez toujours rediriger STDOUT vers autre chose. Ce genre de piratage mais certains modules l'exigent.

# Save STDOUT for restore later 
open(OLD_STDOUT, ">>&STDOUT"); 
open(STDOUT, ">/some/file/or/dev/null"); 
# call your module 
# Restore STDOUT 
open(STDOUT, ">>&OLD_STDOUT");