2010-03-17 22 views
14

मैं पर्ल के लिए नया हूँ और एक तरह से एक बाहरी कमांड को चलाने के लिए के बारे में पता करना चाहते हैं निम्न परिदृश्यों में (यह prg कहते हैं):मैं बाहरी कमांड कैसे चला सकता हूं और पर्ल में अपना आउटपुट कैप्चर कर सकता हूं?

  1. भागो prg, इसकी केवल stdout मिलता है।
  2. रन prg, केवल stderr प्राप्त करें।
  3. रन prg, इसे stdout और stderr, अलग से प्राप्त करें। अपने stdout और stderr
+9

अपने आप को एक बड़ा पक्ष बनाएं और perldoc.perl.org पर कुछ समय बिताएं - स्टार्टर्स के लिए "ट्यूटोरियल" और "अक्सर पूछे जाने वाले प्रश्न" क्षेत्र। कमांड लाइन पर सहायता जानकारी तक पहुंचने के लिए पर्ल की प्रणाली के साथ खुद को परिचित करने के लिए इसे चलाएं: 'perldoc --help'। आपके विशिष्ट प्रश्न का उत्तर सीधे कमांड-लाइन खोजों द्वारा पाया जा सकता था जैसे: 'perldoc -q capture' या' perldoc -q बाहरी'। – FMc

+0

आप 'qx' में देखना चाहते हैं, इसमें स्ट्रीम को अलग करने के तरीके हो सकते हैं और इसे चलाने में आसान है। 'qx (" कमांड ");' –

उत्तर

25

आप अपने बाह्य प्रोग्राम निष्पादित और कब्जा करने के लिए backtics उपयोग कर सकते हैं।

डिफ़ॉल्ट रूप से बैकटिक stderr त्यागने और केवल बाहरी program.So

$output = `cmd`; 

कार्यक्रम cmd की stdout को पकड़ने और stderr को निकाल देगा के stdout लौट आते हैं। का उपयोग करते हुए आप ऊपर में सक्षम नहीं हो जाएगा

$output = `cmd 2>&1`; 

:

केवल stderr पर कब्जा करने के लिए आप के रूप में खोल की फाइल वर्णनकर्ता का उपयोग कर सकते हैं:

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

दोनों stdout पर कब्जा करने के लिए और stderr आप कर सकते हैं से stderr को अलग करने के लिए। separte करने के लिए stdoutstderr से एक अलग फाइल करने के लिए दोनों अनुप्रेषित कर सकते हैं और फ़ाइलों को पढ़ने:

`cmd 1>stdout.txt 2>stderr.txt`; 
+2

अस्थायी फ़ाइलों का उपयोग किए बिना, stdout और stderr को अलग से पढ़ने का एक और तरीका, आईपीसी :: ओपन 3 का उपयोग करना है। – dave4420

+2

हर बार बैकटीक्स का उपयोग किया जाता है, एक बिल्ली का बच्चा मर जाता है। खोल में, $() का उपयोग करें। Perl में, qx का उपयोग करें। –

+0

इसके लिए धन्यवाद, मैंने क्यूएक्स का उपयोग करने से पहले 20 बिल्ली के बच्चे को मार डाला;) – Severun

8

ज्यादातर मामलों में आप qx// ऑपरेटर (या बैकटिक) का उपयोग कर सकते हैं। यह तारों को अलग करता है और उन्हें खोल के साथ निष्पादित करता है, ताकि आप पुनर्निर्देशन का उपयोग कर सकें।

  • एक आदेश के STDOUT पर कब्जा करने के लिए (STDERR अप्रभावित है):

    $output = `cmd`; 
    
  • एक साथ एक आदेश के STDERR और STDOUT पर कब्जा करने के लिए:

    $output = `cmd 2>&1`; 
    
  • एक आदेश के STDERR कब्जा लेकिन छोड़ने के लिए इसका STDOUT (ऑर्डरिंग यहां महत्वपूर्ण है):

    $output = `cmd 2>&1 1>/dev/null`; 
    
  • आदेश STDERR कब्जा लेकिन पुराने STDERR अपने STDOUT छोड़ बाहर आने के लिए करने के लिए एक कमांड के STDOUT और STDERR का आदान-प्रदान करने के लिए:

    $output = `cmd 3>&1 1>&2 2>&3 3>&-`; 
    
  • दोनों एक कमांड के STDOUT और अलग से अपनी STDERR पढ़ने के लिए, यह करने के लिए सबसे आसान है उन्हें फ़ाइलों के लिए अलग से भेज सकतीं, और फिर उन फ़ाइलों से पढ़ने जब प्रोग्राम किया जाता है:

    system("program args 1>program.stdout 2>program.stderr"); 
    
संबंधित मुद्दे

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