2016-05-09 52 views
5

में एक चर के लिए सिस्टम कमांड के परिणाम को बाध्य करना हास्केल और में सिस्टम कमांड कैसे चलाता है इसके परिणाम (यानी मानक आउटपुट) को एक चर में बांधें? छद्म-हैकेल में मैं निम्नलिखित की तरह कुछ ढूंढ रहा हूं:हास्केल

import System.Process 

main = do output <- callCommand "echo hi" 
      putStrLn output -- result: "hi" 

यह काम नहीं करता है। क्या ऐसा कुछ ऐसा है?

+2

उपयोग [ 'readProcess'] (https://hackage.haskell.org/package/process- 1.4.2.0/docs/System-Process.html#v:readProcess) 'callCommand' – Carsten

उत्तर

6

यहाँ कुछ काम कर कोड है:

import System.Process 

main :: IO() 
main = do 
    let stdin' = "" 
    (errCode, stdout', stderr') <- readProcessWithExitCode "echo" ["hi"] stdin' 
    putStrLn $ "stdout: " ++ stdout' 
    putStrLn $ "stderr: " ++ stderr' 
    putStrLn $ "errCode: " ++ show errCode 

कार्स्टन नोटों के रूप में, आप readProcess उपयोग कर सकते हैं, लेकिन मैं इस संस्करण पसंद करते हैं क्योंकि किसी भी गंभीर उपयोग के साथ, आप जल्दी ही बहुत क्यों अपने आदेश चुपचाप है के रूप में उलझन में हो जाएगा असफल (यदि आप कमांड लाइन में भागते हैं, तो स्टडआउट और स्टडर दोनों, निश्चित रूप से दिखाए जाते हैं)।

+1

टिप्पणी के बजाय टिप्पणी: यदि आप 'System.IO का उपयोग करना चाहते हैं तो' stdout',' stderr' या 'stdin' नामों का उपयोग न करें 'उसी संदर्भ में, चूंकि' System.IO' उन नामों को मानक धाराओं में 'हैंडल' के रूप में निर्यात करता है। – Zeta

+0

@ ज़ेटा वैध बिंदु, मैं प्राइम किए गए संस्करणों में बदल गया हूं .... – jamshidh

+0

@jamshidh: मैंने इस उत्तर में एक अन्य पोस्ट में एक फॉलो-अप प्रश्न बनाया: http://stackoverflow.com/questions/37197388/binding-the -इंटर-आउट-ऑफ-ऑन-चालू-सिस्टम-प्रोसेस-टू-ए-वेरिएबल-इन-हैकेल – George

2

jamshidh के जवाब में विस्तार करते हुए, अगर बजाय String के रूप में stdout और stderr होने का आप उन्हें ByteString या Text के रूप में प्राप्त करना चाहते हैं, तो आप process-extras पैकेज का उपयोग कर सकते हैं।

$ import System.Process.Streaming 
$ execute (piped (shell "echo foo")) (liftA3 (,,) (foldOut intoLazyBytes)  
                (foldErr intoLazyBytes) 
                exitCode) 
("foo\n","",ExitSuccess) 

इसके अलावा Text के लिए:

तुम भी मेरी process-streaming पैकेज का उपयोग कर सकते

$ import System.Process.Streaming.Text 
$ execute (piped (shell "echo foo")) (liftA3 (,,) (foldOut (transduce1 utf8x intoLazyText)) 
                (foldErr (transduce1 utf8x intoLazyText)) 
                exitCode) 
("foo\n","",ExitSuccess)