更新:要以编程方式“驱动”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/