我有一个如下函数来执行命令并向stdout(终端)显示输出:
package main
// https://blog.kowalczyk.info/article/wOYk/advanced-command-execution-in-go-with-osexec.html
import (
"bytes"
"io"
"fmt"
"log"
"os"
"os/exec"
)
func main() {
cmd := exec.Command("./test.sh")
var stdoutBuf, stderrBuf bytes.Buffer
cmd.Stdout = io.MultiWriter(os.Stdout, &stdoutBuf)
cmd.Stderr = io.MultiWriter(os.Stderr, &stderrBuf)
err := cmd.Run()
if err != nil {
log.Fatalf("cmd.Run() failed with %s\n", err)
}
outStr, errStr := string(stdoutBuf.Bytes()), string(stderrBuf.Bytes())
fmt.Printf("\nout:\n%s\nerr:\n%s\n", outStr, errStr)
}
这是要测试的 bash 脚本:
#!/bin/bash
declare -a arr=("frontend" "backend" "middleware" "apigateway")
for service in "${arr[@]}"
do
sleep 1
echo $service-prod-secret.yaml
done
现在,我只在命令运行时输出输出到操作系统。Stdout(终端),但我想让这个输出逐行推送到一些地方(EX:socket)以显示执行命令的进度,因为我有一个命令需要很长时间才能完成,很难只看到白屏而不知道命令的进度。
输出:
frontend-prod-secret.yaml
backend-prod-secret.yaml
middleware-prod-secret.yaml
apigateway-prod-secret.yaml
out:
frontend-prod-secret.yaml
backend-prod-secret.yaml
middleware-prod-secret.yaml
apigateway-prod-secret.yaml
我需要等待命令完成才能获得输出,但这需要很长时间。
如何逐行(实时)引用输出以推送到所需的某些位置?
梵蒂冈之花
斯蒂芬大帝
相关分类