戈兰阅读班线每行命令输出
问题描述:
我想读一行输出命令行。为此,我使用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的用法不正确。
答
{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()
。
你有一个结果。你应该得到多少条线?对我来说,代码看起来不错。 –
@SimoEndre:我应该获得5行。我用shell命令的输出编辑了这篇文章。 – Julio