英文:
Programmatically writing stdin for an os.Process
问题
更新:要以编程方式“驱动”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"))时,进程将文件作为stdin并在io.EOF处退出。如何创建一个“无限长”的可写文件?通过查看文档,似乎我需要以某种方式使用os.OpenFile...
英文:
Update: To programmatically "drive" bash, you need a Pseudo terminal (PTY).This is what I looking for:
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)
}
Given the following example:
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)
}
I can run bash as expected:
go run proc.go
bash-3.2$ echo foo
foo
bash-3.2$ exit
exit
'exit status 0'
However, I'd like to specify my own writable stream for os.Stdin and when I try passing it a file (os.Open("/my/file")), the process takes the file as stdin and exits at io.EOF. How can I create an "infinitely long" writable file?
Looking through the docs it seems I'd need to use os.OpenFile in some way...
答案1
得分: 2
你无法这样做。但是,你可以创建一个 os.Pipe() 并将文件推送到其中一侧。只要不关闭管道,它就会无限进行下去。
英文:
You can't. However, you can create an os.Pipe() and push your file to one side. It will be inifinite as long as you do not close the pipe.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论