为了账号安全,请及时绑定邮箱和手机立即绑定

Goland 读取命令的每行输出

Goland 读取命令的每行输出

Go
catspeake 2021-12-07 18:45:04
我想每行读取一个输出命令行。为此,我使用StdoutPipe方法和bufio库:package mainimport (        "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 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

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

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

还要注意原始字符串的使用,它比不断转义所有内容要方便得多。在相关说明中,[]byte(scanner.Text())您应该真正使用scanner.Bytes().


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信