【发布时间】:2017-05-02 11:45:18
【问题描述】:
我的 Go 应用程序输出了一些文本数据,我需要将它传送到一些外部命令(例如 less)。我还没有找到任何方法将这些数据传送到syscall.Exec'ed 进程。
作为一种解决方法,我将该文本数据写入一个临时文件,然后将该文件用作less 的参数:
package main
import (
"io/ioutil"
"log"
"os"
"os/exec"
"syscall"
)
func main() {
content := []byte("temporary file's content")
tmpfile, err := ioutil.TempFile("", "example")
if err != nil {
log.Fatal(err)
}
defer os.Remove(tmpfile.Name()) // Never going to happen!
if _, err := tmpfile.Write(content); err != nil {
log.Fatal(err)
}
if err := tmpfile.Close(); err != nil {
log.Fatal(err)
}
binary, err := exec.LookPath("less")
if err != nil {
log.Fatal(err)
}
args := []string{"less", tmpfile.Name()}
if err := syscall.Exec(binary, args, os.Environ()); err != nil {
log.Fatal(err)
}
}
它可以工作,但会在文件系统上留下一个临时文件,因为 syscall.Exec 用另一个 (less) 替换当前的 Go 进程,而延迟的 os.Remove 不会运行。这种行为是不可取的。
有什么方法可以在不留下任何人工制品的情况下将一些数据传送到外部进程?
【问题讨论】:
标签: go pipe system-calls