我有以下 bash 脚本bash_loop.sh,它打印 1 到 10 并在中间睡眠 3 秒。
#!/bin/bash\n# Basic while loop\ncounter=1\nwhile [ $counter -le 10 ]\ndo\n echo $counter\n ((counter++))\n sleep 3 \ndone\necho All done\nRun Code Online (Sandbox Code Playgroud)\n\n现在,我的 go 代码如下:
\n\nburstingScript := "bash_loop.sh"\ncmd := exec.Command("/bin/sh", burstingScript)\n\nvar out bytes.Buffer\ncmd.Stdout = &out\nif err := cmd.Run(); err != nil {\n fmt.Println("An error has occurred..")\n log.Fatal(err)\n}\nfmt.Println(out.String())\nRun Code Online (Sandbox Code Playgroud)\n\n但是,这只会打印出之后的所有内容,而不是在可用时打印内容。
\n\n所以我的问题是,我是否可以打印每个数字打印每个数字,而不是在 bash 脚本完成执行后打印所有内容。
\n\nPS1:在实际用例中,我必须实时处理 bash 脚本的输出,而不是简单地将内容打印到os.Stdout,所以我想知道是否有任何命令poll(),所以我想知道go 中
PS2\xef\xbc\x9a在实际用例中,我想在发现有趣的消息后立即与子进程分离。例如,在读取 3 后,我希望函数立即返回 3,而不再等待其余输出,尽管我仍然希望子进程(bash 脚本)本身启动并运行。
\n\nPS3:在Python中,我会做这样的事情
\n\ncmd = "./bash_loop.sh"\np = subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)\n\nresult = {}\nwhile True:\n out = p.stdout.readline()\n if out == \'\' and p.poll() != None:\n break\n if out != \'\':\n #process(out)\n sys.stdout.write(out)\n sys.stdout.flush()\nRun Code Online (Sandbox Code Playgroud)\n\nPS4:现在我已经改进了我的 go 片段以供遵循。如果我在命令运行完毕之前返回,孩子会变成僵尸吗?
\n\nburstingScript := path.Join(rootDir, "bash_loop.sh")\ncmd := exec.Command("/bin/sh", burstingScript)\n\nstdout, _ := cmd.StdoutPipe()\ncmd.Start()\nscanner := bufio.NewScanner(stdout)\nfor scanner.Scan() {\n m := scanner.Text()\n fmt.Println(m)\n //if m=="3" {\n // return process(m)\n //}\n}\ncmd.Wait()\nRun Code Online (Sandbox Code Playgroud)\n
将命令输出设置为 stdout:
cmd.Stdout = os.Stdout
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2448 次 |
| 最近记录: |