戈兰阅读班线每行命令输出

问题描述:

我想读一行输出命令行。为此,我使用StdoutPipe方法和bufio库:戈兰阅读班线每行命令输出

package main 

import (
     "encoding/json" 
     "fmt" 
     "log" 
     "os/exec" 
     "bufio" 
) 


func main() { 
     cmd := exec.Command("printf", "{\"Name\": \"Bob\", \"Age\": 1}\n%.0s", "{1..5}") 
     stdout, err := cmd.StdoutPipe() 
     if err != nil { 
       log.Fatal(err) 
     } 
     scanner := bufio.NewScanner(stdout) 
     if err := cmd.Start(); err != nil { 
       log.Fatal(err) 
     } 
     var person struct { 
       Name string 
       Age int 
     } 
     for scanner.Scan() { 
       if err := json.Unmarshal([]byte(scanner.Text()), &person); err != nil { 
         log.Fatal(err) 
       } else { 
         fmt.Printf("%s is %d years old\n", person.Name, person.Age) 
       } 
     } 
     if err := cmd.Wait(); err != nil { 
       log.Fatal(err) 
     } 
} 

我应该得到5行:

$ printf "{\"Name\": \"Bob\", \"Age\": 1}\n%.0s" {1..5} 
{"Name": "Bob", "Age": 1} 
{"Name": "Bob", "Age": 1} 
{"Name": "Bob", "Age": 1} 
{"Name": "Bob", "Age": 1} 
{"Name": "Bob", "Age": 1} 

的一点是,我只得到了第一线。我在Go上很新,我猜StdoutPipe的用法不正确。

+0

你有一个结果。你应该得到多少条线?对我来说,代码看起来不错。 –

+0

@SimoEndre:我应该获得5行。我用shell命令的输出编辑了这篇文章。 – Julio

{1..5}被shell扩展到1 2 3 4 5,所以你必须做你自己:

cmd := exec.Command("printf", `{"Name": "Bob", "Age": %s}\n`, `1`, `2`) // etc. 

还要注意使用原始的字符串,它不是不停地逃避一切都方便多了。并在相关的说明,而不是[]byte(scanner.Text())你真的应该使用scanner.Bytes()