2010-02-05 20 views
7

Perl komut dosyasından bir SVN etiketinin varlığını kontrol etmeye çalışıyorum. Bu yüzden, svn info $url numaralı telefonu arayın, çıkış kodunu okuyun ve standart çıktıları ve standart hata akışlarını bastırın. Ancak, ben (orada bir etiket hakkında SVN sormak muhtemelen daha iyi yolları vardır, ama bu noktası burada değil) zarif bunu için mücadele: $output içine koyarkenPerl'de hem çıkış hem de çıkış kodunu yakalarken harici bir komut dosyasını nasıl çalıştırırım?

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

Bu çıktısını almaz. Çıkış kodu kayboldu.

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

Bu STDERR ve STDOUT hem bastırır ve $output içine ikisini de koyar. Çıkış kodu tekrar kaybolur.

Bu, çıkış kodunu yakalar, ancak gerçek çıktı ve hata akışı kullanıcıya görünür.

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

Bu STDOUT ve STDERR öldürür ve çıkış kodu yakalar, ama orijinaline geri STDOUT geçmek için hatırlamak zorunda kalacak çünkü çirkin.

Yani, daha zarif bir çözüm var mı?

cevap

8

$? .e.g kullanmayı deneyin.

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

+2

çıkış kodu $ 'yüksek bayt olduğunu aday olacağını?', 'm $ ihtiyaç böylece? >> 8'. –

+0

@brian: bunu işaretlediğiniz için teşekkürler. – bhups

+1

Cevabınızı düzenlemeniz gereken bir şeydi. :) –

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

Bu, hem STDERR ve STDOUT bastırır ve $ çıktı içine ikisini de koyar. Çıkış kodu tekrar kayboldu

Çıkış kodunun kaybolduğundan emin misiniz? Bunu denediğimde, çıkış kodunu $?'da aldım.

+0

Peki, çıkış kodu $ $ 'da yüksek bayttır, bu yüzden' $ 'ye ihtiyacınız var? >> 8'. –

3

IPC::System::Simple ile denediğinizde ne olur?

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

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

modül IPC::Run3 giriş ve çıkış üzerinden çok ince taneli kontrol sağlar: Bu modül sorunların bu tür detayların en yönetir.

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

Sen \$out ve \$err aynı değişken geçirebilirsiniz ve her iki akımı birleştiren beklediğiniz yapacağız. giriş gereksiz olduğunu ve böylece geçebilir ya undef veya \undef ("kapalı dt".) ("üst süreçten miras")

IPC::Run3::run3() döner doğru veya çıkış koduna bağlı yanlış ve gerçek çıkış kodu bırakır 'perlvar' göre $? çocuk sürecinin. Senin durumunda

Eğer

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

run3 gelen dönüş değeri sadece dosya elleriyle ele alınması ile ilgilidir. Sürecin çıkış kodu için anlamsızdır. –