Sto cercando di verificare la presenza di un tag SVN da uno script Perl. Così provo a chiamare svn info $url
, leggere il codice di uscita e sopprimere l'output standard e gli stream di errore standard. Tuttavia, faccio fatica a fare questo con eleganza (ci sono modi probabilmente meglio chiedere SVN su un tag, ma non è questo il punto qui):Come si esegue uno script esterno mentre si acquisiscono sia il codice di uscita che quello di uscita in Perl?
my $output = `svn info $url/tags/$tag`;
Questa sopprime l'uscita, mentre la messa in $output
. Il codice di uscita è perso.
my $output = `svn info $url/tags/$tag 2>&1`;
Questo sopprime sia STDERR e STDOUT e li mette in entrambi $output
. Il codice di uscita è di nuovo perso.
my $exitcode = system("svn", "info", "$url/tags/$tag");
Questo preleva il codice di uscita, ma l'output effettivo e il flusso di errori sono visibili all'utente.
open(STDERR, q{>}, "/dev/null");
open my $fh, q{>}, "/dev/null";
select($fh);
if (system("svn", "info", "$url/tags/$tag") != 0) {
select(STDOUT);
print ("Tag doesn't exist!");
do_something_with_exit();
}
select(STDOUT);
print "Exit code: $exitcode";
Questo uccide la STDOUT e STDERR e le catture il codice di uscita, ma è brutto, perché avrei dovuto per ricordare per commutare lo STDOUT Torna all'originale.
Quindi, c'è una soluzione più elegante?
Il codice di uscita è il byte alto in '$?', Quindi è necessario '$? >> 8'. –
@brian: grazie per averlo indicato. – bhups
Questo è stato un po 'spiacevole per voi per modificare la tua risposta. :) –