2009-12-09 11 views
19

मान लें कि मैं एक कार्यक्रम में 'ls' चलाने के लिए चाहता हूं, और परिणामों को एक स्ट्रिंग में संग्रहीत करना चाहता हूं। निष्पादन और ओएस पैकेज में कांटा प्रक्रियाओं के लिए कुछ कमांड प्रतीत होते हैं, लेकिन उन्हें stdout, आदि के लिए फ़ाइल तर्क की आवश्यकता होती है। क्या आउटपुट को स्ट्रिंग के रूप में प्राप्त करने का कोई तरीका है?आप गो में सिस्टम कमांड का आउटपुट कैसे प्राप्त करते हैं?

उत्तर

4

उपयोग exec.Run stdout के रूप में Pipe को निर्दिष्ट (और stderr अगर आप चाहते हैं) द्वारा। यह cmd वापस करेगा, जिसमें Stdout (और Stderr) फ़ील्ड में os.File शामिल है। फिर आप उदाहरण के लिए ioutil.ReadAll का उपयोग कर इसे पढ़ सकते हैं।

उदाहरण:

package main 

import (
    "fmt" 
    "log" 
    "os/exec" 
) 

func main() { 
    out, err := exec.Command("date").Output() 
    if err != nil { 
     log.Fatal(err) 
    } 
    fmt.Printf("The date is %s\n", out) 
} 

out कहाँ standart उत्पादन होता है:

package main 

import (
    "exec"; 
    "io/ioutil"; 
) 

func main() { 
    if cmd, e := exec.Run("/bin/ls", nil, nil, exec.DevNull, exec.Pipe, exec.MergeWithStdout); e == nil { 
     b, _ := ioutil.ReadAll(cmd.Stdout) 
     println("output: " + string(b)) 
    } 
} 
+3

मुझे नहीं लगता कि "exec" पैकेज अब मौजूद है। मुझे नीचे "Fsh द्वारा सूचीबद्ध" ओएस/exec "का उपयोग करना पड़ा। –

2

exec.Run का उपयोग करें, जो स्टडआउट के लिए पाइप पास कर रहा है। पाइप से पढ़ें जो यह लौटाता है।

+0

शायद exec.Run() (जो एक Cmd रिटर्न), बजाय Cmd के रूप में भेजा जाना चाहिए यही कारण है कि .Run। – esm

+0

हूप्स। धन्यवाद। – Glomek

70

अब एक आसान तरीका है। यह प्रारूप []byte में है, लेकिन आप आसानी से स्ट्रिंग के लिए इसे बदल सकते हैं साथ:

string(out) 

तुम भी Output() जो मानक आउटपुट और मानक त्रुटि देता है के बजाय CombinedOutput() उपयोग कर सकते हैं।

+3

यह सबसे अधिक स्वीकार्य उत्तर अब होना चाहिए। स्वीकृत उत्तर अब भी संकलित नहीं होता है। –

2

दोनों stdout हो और अलग तार में stderr करने के लिए, तुम इतनी तरह बाइट बफ़र्स उपयोग कर सकते हैं:

cmd := exec.Command("date") 
var outb, errb bytes.Buffer 
cmd.Stdout = &outb 
cmd.Stderr = &errb 
err := cmd.Run() 
if err != nil { 
    log.Fatal(err) 
} 
fmt.Println("out:", outb.String(), "err:", errb.String()) 
संबंधित मुद्दे