【发布时间】:2020-06-26 01:15:57
【问题描述】:
我正在尝试调用外部命令(例如,seq 10)并获取其输出,处理输出,然后打印出处理后的结果。但是下面的代码不起作用。你能告诉我如何让它工作吗?
// vim: set noexpandtab tabstop=2:
package main
import (
"bufio"
"io"
"os"
"log"
"os/exec"
)
func main() {
cmd := exec.Command("seq", "10")
stdin := bufio.NewReader(cmd.Stdout)
err := cmd.Run()
if err != nil {
log.Fatalf("cmd.Run() failed with %s\n", err)
}
for {
line, err := stdin.ReadBytes('\n')
if err == io.EOF {
if len(line) == 0 { break }
} else {
if err != nil { log.Fatal(err) }
line = line[:(len(line)-1)]
}
os.Stdout.Write(line)
os.Stdout.Write([]byte{'\n'})
}
}
$ $ go run main.go
# command-line-arguments
./main.go:15:30: cannot use cmd.Stdout (type io.Writer) as type io.Reader in argument to bufio.NewReader:
io.Writer does not implement io.Reader (missing Read method)
编辑:我也试过这个。但它也有错误。谁能给我一个可行的例子。
// vim: set noexpandtab tabstop=2:
package main
import (
"bufio"
"io"
"os"
"log"
"os/exec"
)
func main() {
cmd := exec.Command("seq", "10")
stdout, err := cmd.StdoutPipe()
if err != nil { log.Fatal(err) }
stdin := bufio.NewReader(stdout)
err = cmd.Run()
if err != nil {
log.Fatalf("cmd.Run() failed with %s\n", err)
}
for {
line, err := stdin.ReadBytes('\n')
if err == io.EOF {
if len(line) == 0 { break }
} else {
if err != nil { log.Fatal(err) }
line = line[:(len(line)-1)]
}
os.Stdout.Write(line)
os.Stdout.Write([]byte{'\n'})
}
}
【问题讨论】:
-
golang.org/pkg/os/exec/#example_Command 中的示例应该很有用。先试试看那里。
-
@PaSTE 那里的例子不清楚。您能否展示有关如何使用 ReadBytes 处理外部命令输出的完整代码?
-
@user1424739:如果要使用
bufio.Reader,请使用第一条评论中的StdoutPipe,其中也有完整的示例。 -
@JimB 我无法让它工作。您能给我看一个使用 ReadBytes 的工作示例吗?
标签: go