Comment puis-je lire stderr quand l'exécution d'une commande échoue en Perl?
-
08-07-2019 - |
Question
J'exécute une commande diff
dans perl
.
my @lines = `/usr/local/bin/diff -udr \"$expected_file\" \"$gen_file\"`;
if ($? != 0)
{
print ERRFILE "Diff between $expected_file and $gen_file failed\n";
return $diff_err;
}
Ici, le diff
pourrait avoir échoué pour une raison quelconque. Par exemple: stderr a montré que / usr / local / bin / diff: test.txt: Aucun fichier ou répertoire de ce type . Je veux lire ce message dans le programme. Comment puis-je trouver le message stderr de la commande diff
(ou grep
ou de toute commande que j'exécute)?
Appréciez l'aide à l'avance.
Merci, Mathew Liju
La solution
Ceci est répondu dans perlfaq8: Comment capturer STDERR à partir d'une commande externe?
Si je veux lire STDOUT et STDERR d'un processus, j'utilise IPC :: Open3, fourni avec Perl. De cette façon, je n'ai pas à fusionner ces flux et à déterminer plus tard quelle partie de la sortie provient de quoi.
J'essayerais d'éviter les fichiers temporaires autant que possible (donc pas de 2 > file.txt
). C’est trop de travail et de code quand je peux lire STDERR directement.
Autres conseils
Plusieurs modules CPAN facilitent cette opération et vous permettent de séparer STDOUT et STDERR. Par exemple, IO :: CaptureOutput vous permet de le faire comme ceci (bien que vous devrez scinder les lignes vous-même):
use IO::CaptureOutput 'qxx';
my ($stdout, $stderr, $ok) =
qxx( qq(/usr/local/bin/diff -udr "$expected_file" "$gen_file") );
if (! $ok)
{
print ERRFILE "Diff between $expected_file and $gen_file failed\n";
return $stderr;
}
my @lines = split /\n/, $stdout;
- David