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?
El código de salida es el byte alto en '$? ', Por lo que necesita' $? >> 8'. –
@brian: gracias por señalar eso. – bhups
Eso fue un pequeño empujón para que edites tu respuesta. :) –