一尘不染

golang exec.Command读取标准输入

go

我有一个应该调用ruby脚本的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,但是它不等待输入。

我究竟做错了什么?


阅读 501

收藏
2020-07-02

共1个答案

一尘不染

下面的程序好像你问什么(我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)
    }
}
2020-07-02