我正在通过 exec.Command()
运行外部进程,我希望实时打印命令的标准输出并写入文件(类似于使用 tee
来自命令行)。
我可以用扫描仪和写入器来实现:
cmd := exec.Command("mycmd")
cmdStdOut, _ := cmd.StdoutPipe()
s := bufio.NewScanner(cmdStdOut)
f, _ := os.Create("stdout.log")
w := bufio.NewWriter(f)
go func() {
for s.Scan(){
t := s.Text()
fmt.Println(t)
fmt.Fprint(w, t)
w.Flush()
}
}
是否有更惯用的方法来避免破坏 Scan
和 Flush
?
最佳答案
将多写入器分配给写入文件和管道的命令的标准输出。然后,您可以使用管道的读取端来跟踪输出。
此示例的行为类似于 tee
工具:
package main
import (
"io"
"os"
"os/exec"
)
func main() {
var f *os.File // e.g. os.Create, os.Open
r, w := io.Pipe()
defer w.Close()
cmd := exec.Command("mycmd")
cmd.Stdout = io.MultiWriter(w, f)
// do something with the output while cmd is running by reading from r
go io.Copy(os.Stdout, r)
cmd.Run()
}
StdoutPipe 的替代方案:
package main
import (
"io"
"os"
"os/exec"
)
func main() {
var f *os.File
cmd := exec.Command("date")
stdout, _ := cmd.StdoutPipe()
go io.Copy(io.MultiWriter(f, os.Stdout), stdout)
cmd.Run()
}
关于file - 将标准输出流写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48926982/