以编程方式为 os.Process 编写 stdin

更新:要以编程方式“驱动” 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某种方式使用...


慕虎7371278
浏览 251回答 1
1回答

长风秋雁

你不能。但是,您可以创建一个 os.Pipe() 并将您的文件推送到一侧。只要您不关闭管道,它将是无限的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go