2010-02-05 10 views
7

Estoy tratando de verificar la existencia de una etiqueta SVN a partir de un script de Perl. Por lo tanto, intento llamar al svn info $url, leer el código de salida y suprimir la salida estándar y las secuencias de error estándar. Sin embargo, me esfuerzo por hacerlo con elegancia (hay probablemente mejores maneras de pedir SVN sobre una etiqueta, pero ese no es el punto aquí):¿Cómo ejecuto un script externo mientras capturo tanto el código de salida como el de salida en Perl?

my $output = `svn info $url/tags/$tag`; 

Esto suprime la salida, mientras que su puesta en $output. El código de salida se pierde.

my $output = `svn info $url/tags/$tag 2>&1`; 

Esto suprime tanto STDERR y stdout y los dos pone en $output. El código de salida se pierde nuevamente.

my $exitcode = system("svn", "info", "$url/tags/$tag"); 

Esto capta el código de salida, pero la salida real y la secuencia de error son visibles para el usuario.

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"; 

Esto mata al stdout y stderr y atrapa el código de salida, pero es feo, ya que tendría que recordaba a conmutar el stdout originales.

Entonces, ¿hay alguna solución más elegante?

Respuesta

8

Intente utilizar $? .e.g.

my $output = `svn info $url/tags/$tag`; 
my $extcode = $?>>8;

+2

El código de salida es el byte alto en '$? ', Por lo que necesita' $? >> 8'. –

+0

@brian: gracias por señalar eso. – bhups

+1

Eso fue un pequeño empujón para que edites tu respuesta. :) –

1
my $output = `svn info $url/tags/$tag 2>&1`; 

Esto suprime tanto STDERR y stdout y los dos pone en $ salida. El código de salida se pierde nuevamente

¿Estás seguro de que se ha perdido el código de salida? Cuando intento esto, obtengo el código de salida en $?.

+0

Bueno, el código de salida es el byte alto en '$?', ¿Entonces necesitas '$? >> 8'. –

3

¿Qué ocurre cuando lo pruebas con IPC::System::Simple? Dicho módulo se encarga de la mayor parte de los detalles de este tipo de problemas:

use IPC::System::Simple qw(capturex $EXITVAL); 

my $output = capturex("some_command", @args); 
my $exit = $EXITVAL; 
0

El módulo IPC::Run3 da un control muy preciso sobre la entrada y salida.

use IPC::Run3; 
run3 \@cmd, \$in, \$out, \$err; 

Puede pasar la misma variable a \$out y \$err y que va a hacer lo que se espera, la combinación de ambas corrientes. La entrada es innecesaria, y por lo que puede pasar a cualquiera undef ("heredar de proceso padre") o \undef ("gestor de archivo cerrado".)

IPC::Run3::run3() vuelve verdadero o falso dependiendo del código de salida, y deja el código de salida real del proceso secundario en $? según 'perlvar'.

En el caso de que correría

use IPC::Run3 

my @cmd = ('svn', 'info', "$url/tags/$tag"); 
my $out; 
my $rv = run3(\@cmd, \undef, \$out, \$out); 
if ($rv) { 
    # process $out 
} 
else { 
    die "error: [email protected]"; 
} 
+0

El valor de retorno de run3 solo se relaciona con el manejo de Filehandles. No tiene sentido el código de salida del proceso. –

Cuestiones relacionadas