Goland 读取命令的每行输出

我想每行读取一个输出命令行。为此,我使用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 的用法是不正确的。


catspeake
浏览 157回答 1
1回答

慕无忌1623718

{1..5}被1 2 3 4 5shell扩展为,所以你必须自己做:cmd := exec.Command("printf", `{"Name": "Bob", "Age": %s}\n`, `1`, `2`) // etc.还要注意原始字符串的使用,它比不断转义所有内容要方便得多。在相关说明中,[]byte(scanner.Text())您应该真正使用scanner.Bytes().
打开App,查看更多内容
随时随地看视频慕课网APP