Próbuję sprawdzić istnienie znacznika SVN ze skryptu Perla. Więc próbuję wywoływać svn info $url
, czytać kod wyjścia i tłumić standardowe wyjścia i standardowe strumienie błędów. Jednakże, walczę, aby to zrobić elegancko (prawdopodobnie istnieją lepsze sposoby, aby poprosić o znaczniku SVN, ale nie o to tu chodzi):Jak wykonać skrypt zewnętrzny podczas przechwytywania kodu wyjściowego i kodu wyjścia w Perlu?
my $output = `svn info $url/tags/$tag`;
ten hamuje wyjście podczas oddawania go do $output
. Kod zakończenia jest utracony.
my $output = `svn info $url/tags/$tag 2>&1`;
ten hamuje zarówno STDERR i stdout i umieszcza je zarówno do $output
. Kod zakończenia jest ponownie utracony.
my $exitcode = system("svn", "info", "$url/tags/$tag");
To przechwytuje kod wyjścia, ale rzeczywisty strumień danych wyjściowych i błędów jest widoczny dla użytkownika.
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";
To zabija stdout i stderr i łapie kod wyjścia, ale jest brzydki, bo musiałbym zapamiętania, aby przełączyć stdout powrotem do oryginału.
Czy istnieje jakieś bardziej eleganckie rozwiązanie?
Kod zakończenia jest bajt w '$?', Więc trzeba '$? >> 8'. –
@brian: dzięki za wskazanie tego. – bhups
To było trochę zajęcie, aby edytować odpowiedź. :) –