我有一个go程序应该调用一个红宝石脚本。
我有一个runCommand函数:
func runCommand(cmdName string, arg ...string) {
cmd := exec.Command(cmdName, arg...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Stdin = os.Stdin
err = cmd.Run()
if err != nil {
fmt.Printf("Failed to start Ruby. %s\n", err.Error())
os.Exit(1)
}
}我是这样引用的:
runCommand("ruby", "-e", "require 'foo'")它适用于大多数情况,除非在子进程中存在需要暂停输入的gets或任何类似的操作。
我尝试过设置cmd.Stdin = os.Stdin,但它不会等待输入。
我做错了什么?
发布于 2015-05-14 13:03:04
下面的程序似乎是按你的要求做(我的runCommand几乎和你的一样。)我刚刚将=更改为err行的:=。)你在做什么不同的事吗?
package main
import (
"fmt"
"os"
"os/exec"
)
func main() {
runCommand("ruby", "-e", `puts "Running"; $in = gets; puts "You said #{$in}"`)
}
func runCommand(cmdName string, arg ...string) {
cmd := exec.Command(cmdName, arg...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Stdin = os.Stdin
err := cmd.Run()
if err != nil {
fmt.Printf("Failed to start Ruby. %s\n", err.Error())
os.Exit(1)
}
}发布于 2015-05-13 14:15:37
您可能需要使用伪端子。您可以在以下库中完成此操作:github.com/kr/pty
package main
import (
"bufio"
"io"
"log"
"os"
"os/exec"
"github.com/kr/pty"
)
func runCommand(cmdName string, arg ...string) {
cmd := exec.Command(cmdName, arg...)
tty, err := pty.Start(cmd)
if err != nil {
log.Fatalln(err)
}
defer tty.Close()
go func() {
scanner := bufio.NewScanner(tty)
for scanner.Scan() {
log.Println("[" + cmdName + "] " + scanner.Text())
}
}()
go func() {
io.Copy(tty, os.Stdin)
}()
err = cmd.Wait()
if err != nil {
log.Fatalln(err)
}
}
func main() {
log.SetFlags(0)
runCommand("ruby", "-e", `
puts "Enter some text"
text = gets
puts text
`)
}https://stackoverflow.com/questions/30207035
复制相似问题