2016-02-05 70 views
1

我想讀一行輸出命令行。爲此,我使用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

{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()