我想使用 os/exec
从我的 go 代码运行一个外部应用程序。应用程序 my_external_script.sh
分两部分将数据输出到 stdout
:第一部分非常快(三秒后将“A”写入 stdout),第二部分( "B) 仅在 10 秒后写入。
例如:
./my_external_script.sh
.....
.....
A (3 seconds elapsed)
.....
.....
.....
.....
.....
.....
B (10 seconds elapsed)
(program exits with 0 status code)
我目前正在从我的 go 代码中这样执行:
func execMyExternalCmd() (*string, error) {
cmd := exec.Command("my_external_script.sh")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
return nil, err
}
var res = out.String()
return &res, nil
}
问题是,execMyExternalCmd
只会在 10 秒后返回,此时“A”和“B”都已写入,程序退出。我想在 stdout
上可用时立即使用“A”(但稍后也可以在可用时使用“B”)。我怎样才能做到这一点?
最佳答案
package main
import (
"bufio"
"log"
"os/exec"
)
func main() {
cmd := exec.Command("sh", "-c", "echo 1;sleep 10;echo 2;")
outPipe, _ := cmd.StdoutPipe()
scanner := bufio.NewScanner(outPipe)
go func() {
for scanner.Scan() {
log.Println(scanner.Text())
}
}()
cmd.Start()
cmd.Wait()
log.Println("Done")
}
输出:
2016/12/04 17:11:09 1
2016/12/04 17:11:19 2
2016/12/04 17:11:19 Done
使用 channel 从函数发送数据而不是返回。
关于golang 操作系统/exec : get data from stdout in parts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40958903/