2011-07-18 20 views
15

मुझे बैश के 2>&1 कुछ ऐसा करना है जो Haskell में रीडायरेक्ट करता है जो stdout और stderr को एक प्रक्रिया से एक Handle में जोड़ता है। System.Process.createProcess या इसी तरह के लाइब्रेरी फ़ंक्शन के साथ इसे सीधे करना अच्छा होगा, खासकर यदि यह बैश रीडायरेक्ट w.r.t के समान वही अर्थशास्त्र का उपयोग करता है। हैंडल से इनपुट interleaving।मैं हास्केल में हैंडल कैसे जोड़ सकता हूं?

लचीलापन createProcess द्वारा की पेशकश की पहली बार में वादा किया लगता है: एक एक Handle मानक फ़ाइल वर्णनकर्ता के लिए उपयोग करने के लिए निर्दिष्ट कर सकते हैं, इसलिए एक ही Handlestdout और stderr दोनों के लिए दिया जा सकता है। हालांकि, Handle कॉल से पहले तर्क पहले ही मौजूद होना चाहिए। फ़ंक्शन को कॉल करने से पहले पतली हवा से Handle बनाने की क्षमता के बिना, मुझे यकीन नहीं है कि इस समस्या को हल किया जा सकता है।

संपादित करें: समाधान को प्लेटफ़ॉर्म पर ध्यान दिए बिना काम करने की आवश्यकता है।

+1

आप एक पार मंच दृष्टिकोण की जरूरत है? या यह सिर्फ एक यूनिक्स-वाई सिस्टम पर चल रहा है? –

+0

@camccann हाँ; तदनुसार सवाल अद्यतन किया। – acfoltzer

+1

ठीक है, [यहां वह जवाब है जिसे आप प्राप्त कर चुके थे] (http://hackage.haskell.org/packages/archive/unix/2.4.2.0/doc/html/System-Posix-IO.html) अन्यथा। तकनीकी रूप से यह काम करता है यदि आपके पास सिग्विन जैसी संगतता परत है, लेकिन यह है ... eugh। –

उत्तर

3
here से

:

import GHC.IO.Handle -- yes, it's GHC-specific 
import System.IO 

main = do 
    stdout_excl <- hDuplicate stdout 
    hDuplicateTo stderr stdout -- redirect stdout to stderr 

    putStrLn "Hello stderr" -- will print to stderr 
    hPutStrLn stdout_excl "Hello stdout" -- prints to stdout 
+0

बढ़िया! जीएचसी-विशिष्ट पुस्तकालय की वजह से शायद मुझे यह याद आया – acfoltzer

4

एक Handle पर अपने हाथों को प्राप्त करना बहुत कठिन नहीं है: System.IO स्थिरांक stdin,stdout,stderr :: Handle और कार्यों withFile :: FilePath -> IOMode -> (Handle -> IO r) -> IO r और openFile :: FilePath -> IOMode -> IO Handle प्रदान करता है।

वैकल्पिक रूप से, आप createProcess से नई पाइप अनुरोध और खुद को तैयार एक अग्रेषण सेवा (अपने बच्चे के नए stdout और stderr हैंडल से पढ़ रहे हैं और जहाँ भी आप चाहते करने के लिए दोनों को भेजने) के रूप में कर सकता है।

2

चूंकि विंडोज pipe (3) मूल रूप से और जीएचसी की आईओ लाइब्रेरी uses CRT file descriptors internally on Windows का समर्थन करता है, तो कम से कम विंडोज और * दोनों पर काम करने वाले समाधान के साथ आना संभव है। बुनियादी एल्गोरिथ्म है:

  • कॉल pipe। यह आपको दो फ़ाइल डिस्क्रिप्टर देता है जिन्हें आप Handles पर fdToHandle' के साथ परिवर्तित कर सकते हैं।
  • createProcessstdout और stderr दोनों पाइप के लेखन अंत में सेट हैं।
  • पाइप के पढ़ने के अंत से बाल उत्पादन पढ़ें।

System.Posix.Internals मॉड्यूल है, जो c_pipe निर्यात करता है, डिफ़ॉल्ट रूप से छुपा है, लेकिन आप आप उस तक पहुँच देता है कि base के एक कस्टम संस्करण संकलन कर सकते हैं (टिप: का उपयोग cabal-dev)। वैकल्पिक रूप से, आप एफएफआई के माध्यम से pipe तक पहुंच सकते हैं। एनबी: यह समाधान जीएचसी-विशिष्ट है।

+0

ऐसा लगता है कि इसे लागू किया जाना चाहिए, धन्यवाद। मैं इस दृष्टिकोण के साथ प्रयोग कर सकता हूं कि यह दृष्टिकोण कितना पोर्टेबल हो सकता है। – acfoltzer

+0

@acfoltzer क्या आप हमें अपने परिणाम बता सकते हैं? – nh2

+0

@ एनएच 2 हम दुखी समाधान के साथ लापरवाही घायल हो गए। किसी बिंदु पर इसे फिर से देखना अच्छा होगा, हालांकि – acfoltzer

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