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

时间:2014-10-19 03:02:57

标签: go

更新:以编程方式"驱动" bash,你需要一个Pseudo终端(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"))时,该过程将文件作为stdin并退出{ {1}}。我怎样才能创造一个无限长的"可写文件?

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

1 个答案:

答案 0 :(得分:2)

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