2011-02-25 5 views
7

में एसटीडीईआरआर से कैसे छुटकारा पा सकता हूं मैं पर्ल में कुछ सिस्टम कमांड का उपयोग कर रहा हूं।मैं पर्ल

नीचे मामले मैं उत्पादन हो रही थी इस प्रकार में:

ls: import-log.*: No such file or directory 

ls: error-log.*: No such file or directory 

No specified files found for deletion 

मेरे कोड:

sub monthoryear() 
{ 

    @importlog = `ls -al import-log.*`; 

    @errorlog = `ls -al error-log.*`; 

} 

मैं उत्पादन में निम्नलिखित भले ही देखने के लिए नहीं करना चाहते हैं वहाँ कोई फाइल नहीं है

ls: import-log.*: No such file or directory & 

ls: error-log.*: No such file or directory 

उत्तर

5

आप अपने subshell आदेशों में stderr पुनर्निर्देशन जोड़ सकते हैं:

@importlog = `ls -al import-log.* 2>/dev/null`; 
@errorlog = `ls -al error-log.* 2>/dev/null`; 
+0

क्या अगर मैं उस त्रुटि संदेश को कैप्चर करना चाहता हूं ??? – Sunny

+0

@ सनी - आप उस मामले में/dev/null की बजाय फ़ाइल का उपयोग कर सकते हैं, बस/path/to/file – justkt

+0

के साथ प्रतिस्थापित करें, क्या मैं इसे एक चर में प्राप्त कर सकता हूं? – Sunny

1

आप अनुप्रेषित कर सकते हैं stderr रूप /dev/null रहे हैं:

@importlog = `ls -al import-log.* 2> /dev/null`; 

@errorlog = `ls -al error-log.* 2> /dev/null`; 
13

जबकि अन्य उत्तर सही के बारे में सही कर रहे हैं आपके द्वारा पूछे जाने वाले तकनीकी प्रश्न, आपको पर्ल में प्रभावी रूप से एक शेल स्क्रिप्ट लिखने पर विचार करना चाहिए।

आपको बैकटाइटेड ls पर कॉल करने के बजाय फ़ाइल सूची (उदा। glob() या File::Find) प्राप्त करने के मूलभूत तरीकों का उपयोग करना चाहिए।

+1

यह वास्तव में सही उत्तर है।पर्ल में ऐसा करने का मतलब है कि आप एसटीडीईआरआर को पुनर्निर्देशित करने के बिना आउटपुट को एक चर में कैप्चर कर सकते हैं जिसके परिणामस्वरूप दूरी पर डरावनी कार्रवाई हो सकती है। – CanSpice

-1

Subshells, माता पिता की STDERR वारिस इसलिए यदि आप एक वैश्विक स्तर पर यह करने के लिए चाहते हैं, आप ऐसा कर सकते हैं होगा: बाहर perlfaq8

open(STDERR,'>/dev/null'); 
`ls non-existent-file`; 
`ls non-existent-file2`; 
`ls non-existent-file3`; 
`ls non-existent-file4`; 
`ls non-existent-file5`;
+0

आपको शून्य तर्क प्राप्त करने के लिए तीन तर्क खुले और फ़ाइल :: स्पेक का उपयोग करना चाहिए: – shawnhcorey

4

चेक। यदि आपको परवाह नहीं है कि यह STDOUT या STDERR है, तो आप दोनों को STDOUT पर रीडायरेक्ट कर सकते हैं।

$output = `$cmd 2>&1`; 

आपके मामले में, आप शायद सिर्फ STDERR से छुटकारा पाने के लिए चाहते हैं:

$output = `$cmd 2>/dev/null`; 

हालांकि, मैं DVK's answer से सहमत हैं। फ़ाइलों की सूची प्राप्त करने के लिए बाहरी कमांड का उपयोग करना मूर्खतापूर्ण लगता है। आपको File::Find का उपयोग करना चाहिए। इस तरह आप कुछ विफल होने पर पर्ल की सामान्य त्रुटि हैंडलिंग का उपयोग कर सकते हैं।

#!/usr/bin/perl 
use strict; 
use warnings; 
use File::Find; 

my @importlog; 
my @errorlog; 
find(sub { 
    push @importlog, $File::Find::name if /^import-log\.*/; 
    push @errorlog, $File::Find::name if /^error-log\.*/; 
}, '.'); 

print "Import log:\n", join("\n", @importlog), "\n"; 
print "Error log:\n", join("\n", @errorlog), "\n"; 
5

पुनर्निर्देशन अशक्त डिवाइस के लिए STDERR:

use File::Spec; 
open STDERR, '>', File::Spec->devnull() or die "could not open STDERR: $!\n"; 
2

एक नई चेतावनी दी हुक बनाएं, फिर संदेश के साथ कुछ करना है, यह स्टोर, उपेक्षा यह आदि ...

local $SIG{__WARN__} = sub { 
    my $message = shift; 

    ## do nothing to ignore all together 

    ## ignore specific message 
    # warn $message unless $message =~ /No such file or directory/; 

    ## or do something else 
    # die $message ## make fatal 
    # open my $fh, '>', 'file.log'; print $fh $message; 
};