2013-10-31 49 views
5

मैं कुछ कोड लिखने की कोशिश कर रहा हूं जो grep बाहरी रूप से चलाता है, फिर आउटपुट का विश्लेषण करता है। विशेष रूप से, मैंक्या मैं पढ़ सकता हूं प्रसंस्करण ड्रॉप उद्धरण?

grep <username> *.test 

लेकिन, दुर्भाग्य से,

readProcess "grep" [username, "*.test"] 

तर्क

grep "<username>" "*.test" 

और दोहरे उद्धरण चिह्नों के साथ आदेश उत्पन्न करने के लिए लगता है क्या करना चाहते हैं के रूप में कोई व्यक्तिगत बुलाया फ़ाइल है तारांकन-बिंदु-परीक्षण, grep बारफ। .test एक्सटेंशन वाली फ़ाइलें हैं।

क्या मैं आदेश जारी करने के लिए readProcess (या कुछ समान) को राजी कर सकता हूं?

उत्तर

9

"*" grep द्वारा विस्तारित नहीं किया गया है, लेकिन खोल द्वारा। यदि आप विस्तार चाहते हैं तो आपको sh -c 'grep username *.test जैसे कुछ चलाना चाहिए।

ShellCommand तर्क के साथ createProcess का उपयोग करने का एक बेहतर तरीका है।

+0

यह एक तरह का असुविधाजनक है कि 'System.Process' के पास' readProcess' के बराबर नहीं है जो खोल से बचता है। यह एक बहुत ही सामान्य उपयोग मामला है। –

+0

यह एक उपयोगी सुराग था, धन्यवाद। मेरा कामकाज, जो अब इरादे के रूप में काम करता है, एक शेल स्क्रिप्ट में grep कमांड लिखना है, फिर 'readProcessWithExitCode' का उपयोग करके स्क्रिप्ट का आह्वान करें, क्योंकि एक शून्य प्रतिक्रिया काफी स्वीकार्य है लेकिन grep द्वारा विफलता के रूप में रिपोर्ट की गई है। – pigworker

1

शायद आप createProcess पर जा रहे हैं, जो सबसे सामान्य प्रक्रिया निर्माण कार्य है। कुछ की तरह ...

import System.Process 
import System.IO 

makeGrep username file = "grep " ++ username ++ " " ++ file 

main :: IO() 
main = do 
    (_, Just hOut, _, hProc) <- createProcess (
           (shell (makeGrep "bob" "*.test")) 
           { std_out = CreatePipe } 
          ) 
    exitCode <- waitForProcess hProc 
    output <- hGetContents hOut 
    print output 
+0

यहां सावधान रहें। आप आलसी I/O द्वारा बुरी तरह से काट सकते हैं। यदि आप 'System.Process' में 'readProcess' के लिए कोड देखते हैं, तो आप इसे सुरक्षित तरीके से करने के लिए क्या आवश्यक है इसका एक अच्छा विचार प्राप्त कर सकते हैं। –

0

मैं आमतौर पर System.Cmd से system का उपयोग करें। आपको एक सही शेल कमांड बनाना होगा (उदाहरण के लिए सभी भागना) लेकिन इसका लाभ यह है कि यह स्ट्रिंग का उपयोग करता है जैसा कि यह प्रदान किया गया है।

+0

मुझे यकीन नहीं है कि मैं इस तरह से जारी किए गए आदेश के आउटपुट को कैसे छीनता हूं। – pigworker

+0

हम्म, मुझे यह आवश्यकता याद आई। –

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