以编程方式为操作系统编写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("foon"))
        f.Write([]byte("barn"))
        f.Write([]byte("bazn"))
        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 %vn", err)
        return
    }
    state, err := process.Wait()
    if err != nil {
        fmt.Printf("wait err %vn", 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并在io.EOF退出。如何创建一个"无限长"的可写文件?

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

你不能。但是,您可以创建操作系统。Pipe()并将文件推到一边。只要你不关上管子,它就会是有限的。

最新更新