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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top