2010-02-05 9 views
7

मैं एक पर्ल स्क्रिप्ट से एक एसवीएन टैग अस्तित्व की जांच करने की कोशिश कर रहा हूं। इसलिए मैं svn info $url पर कॉल करने का प्रयास करता हूं, निकास कोड पढ़ता हूं और मानक आउटपुट और मानक त्रुटि स्ट्रीम दबाता हूं। हालांकि, मैं इस सुंदर ढंग से करने के लिए (वहाँ शायद बेहतर तरीके एक टैग के बारे में पूछने के लिए SVN हैं, लेकिन उस समय यहाँ नहीं है) संघर्ष:पर्ल में आउटपुट और निकास कोड दोनों को कैप्चर करते समय मैं बाहरी स्क्रिप्ट कैसे निष्पादित करूं?

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

यह आउटपुट को दबा जबकि यह $output में डाल। बाहर निकलें कोड खो गया है।

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

यह दोनों STDERR और STDOUT को घटाती है तथा उन दोनों $output में डालता है। बाहर निकलें कोड फिर से खो गया है।

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

यह निकास कोड को पकड़ता है, लेकिन वास्तविक आउटपुट और त्रुटि स्ट्रीम उपयोगकर्ता को दिखाई देती है।

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

यह STDOUT और STDERR को मारता है और बाहर निकलने के कोड पकड़ता है, लेकिन यह बदसूरत है क्योंकि मैं STDOUT मूल पर बदलने में याद करना होगा।

तो, क्या कोई और सुरुचिपूर्ण समाधान है?

उत्तर

8

$? का उपयोग करने का प्रयास करें .e.g।

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

+2

बाहर निकलें कोड '$ में उच्च बाइट है?', ताकि आप '$ की ज़रूरत है? >> 8'। –

+0

@brian: इसे इंगित करने के लिए धन्यवाद। – bhups

+1

यह आपके उत्तर को संपादित करने के लिए थोड़ी सी बात थी। :) –

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

यह दोनों STDERR और STDOUT को घटाती है तथा उन दोनों को $ उत्पादन में डालता है। बाहर निकलें कोड फिर से खो गया है

क्या आप वाकई निकास कोड खो गए हैं? जब मैं इसे आज़माता हूं, तो मुझे $? में निकास कोड मिलता है।

+0

खैर, निकास कोड '$?' में उच्च बाइट है, तो आपको '$ की आवश्यकता है? >> 8'। –

3

जब आप IPC::System::Simple के साथ प्रयास करते हैं तो क्या होता है?

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

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

मॉड्यूल IPC::Run3 इनपुट और आउटपुट पर बहुत सुक्ष्म नियंत्रण देता है: यह मॉड्यूल समस्याओं के इन प्रकार के विवरण के सबसे संभालती है।

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

आप \$out और \$err के लिए एक ही चर पारित कर सकते हैं और यह दोनों धाराओं के संयोजन, आप क्या उम्मीद करेंगे। इनपुट अनावश्यक है, और इसलिए आप पास कर सकते हैं या तो undef या \undef ("बंद filehandle"।) ("जनक प्रक्रिया से विरासत")

IPC::Run3::run3() रिटर्न सच है या बाहर निकलने के कोड के आधार पर झूठे, और वास्तविक बाहर निकलने के कोड को छोड़ देता है 'perlvar' के अनुसार $? में बाल प्रक्रिया का।

अपने मामले में आप चल पाएंगे

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

रन 3 से वापसी मूल्य केवल फाइलहेडल्स के हैंडलिंग से संबंधित है। प्रक्रिया के बाहर निकलने के लिए यह अर्थहीन है। –

संबंधित मुद्दे

 संबंधित मुद्दे