Comment faire pour rediriger STDOUT et STDERR vers une variable
Je veux rediriger STDERR
et STDOUT
à une variable. Je l'ai fait.
close(STDOUT);
close(STDERR);
my $out;
open(STDOUT, ">>", $out);
open(STDERR, ">>", $out);
for(1..10)
{
print "print\n"; # this is ok.
warn "warn\n"; # same
system("make"); # this is lost. neither in screen nor in variable.
}
Le problème avec system
. Je veux que la sortie de cet appel à être capturé.
OriginalL'auteur Deck | 2010-12-11
Vous devez vous connecter pour publier un commentaire.
Cherchez-vous à capturer la sortie dans une variable? Si oui, vous avez l'utilisation de backticks ou
qx{}
appropriée de la redirection. Par exemple, vous pourriez utiliser:(Il m'arrive d'avoir des programmes pth1, pth2 et pth3 dans le répertoire - elles ont été faites OK; pth4 et au-dessus des erreurs d'écriture sur la sortie stderr; la redirection a été nécessaire.)
Vous devriez toujours vérifier le succès des opérations telles que
open()
.Pourquoi est-ce nécessaire? Parce que l'écriture d'une variable nécessite la coopération des processus de faire de l'écriture et
make
ne sais pas comment coopérer.OriginalL'auteur Jonathan Leffler
utilisation Capture::Minuscule!
OriginalL'auteur salva
Il existe plusieurs façons de redirection et de restauration de la sortie standard STDOUT. Certains d'entre eux travaillent avec STDERR trop. Voici mes deux favoris:
À l'aide de
select
:À l'aide de
local
:Profiter.
OriginalL'auteur mndrix
La raison de ce qui se passe est que le STDOUT et STDERR "descripteurs" sont pas équivalent à stderr et stdout poignées prévues par le shell pour le binaire perl. Afin d'obtenir ce que vous voulez, vous devez utiliser ouvert au lieu de
system
c'est moyen de le faire.
OriginalL'auteur grncdr
Pourquoi ne pas
use IPC::Open3
?OriginalL'auteur Dallaylaen