go - 以编程方式为 os.Process 编写标准输入

标签 go

更新:要以编程方式“驱动”bash,您需要一个伪终端 (PTY)。这就是我要找的:

https://github.com/kr/pty

package main

import (
    "github.com/kr/pty"
    "io"
    "os"
    "os/exec"
)

func main() {
    c := exec.Command("grep", "--color=auto", "bar")
    f, err := pty.Start(c)
    if err != nil {
        panic(err)
    }

    go func() {
        f.Write([]byte("foo\n"))
        f.Write([]byte("bar\n"))
        f.Write([]byte("baz\n"))
        f.Write([]byte{4}) // EOT
    }()
    io.Copy(os.Stdout, f)
}

给定以下示例:

package main

import (
    "fmt"
    "os"
)

func main() {
    attr := &os.ProcAttr{
        Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
    }
    process, err := os.StartProcess("/bin/bash", nil, attr)
    if err != nil {
        fmt.Printf("process err %v\n", err)
        return
    }
    state, err := process.Wait()
    if err != nil {
        fmt.Printf("wait err %v\n", err)
    }
    fmt.Printf("'%+v'\n", state)
}

我可以按预期运行 bash:

go run proc.go
bash-3.2$ echo foo
foo
bash-3.2$ exit
exit
'exit status 0'

但是,我想为 os.Stdin 指定我自己的可写流,当我尝试向它传递一个文件时 (os.Open("/my/file")),该进程将文件作为标准输入并在 io.EOF 处退出。如何创建“无限长”的可写文件?

查看文档似乎我需要以某种方式使用 os.OpenFile...

最佳答案

你不能。但是,您可以创建一个 os.Pipe() 并将文件推到一侧。只要你不关闭管道,它将是无限的。

关于go - 以编程方式为 os.Process 编写标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26446868/

相关文章:

json - golang无法解析反射创建的对象的json

powershell - 如何在 Go 中使用 VirtualQueryEx 读取检索进程内存信息?

go - 如何安装依赖项的二进制文件?

go - 如何确保 redis 订阅者在 Go (Golang) 中收到消息?

go - 如何使用 go-client 在 kubernetes 中获取 pod 的状态

go - 我怎样才能建立一个集合?

go - 多变量分配

concurrency - 在处理 3rd 方代码时,如何知道 Go 中会同时发生什么

go - golang 基准测试可以提供自定义输出吗?

go - 将数组作为函数参数传递