首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >金刚exec.Command读std输入

金刚exec.Command读std输入
EN

Stack Overflow用户
提问于 2015-05-13 06:16:41
回答 2查看 5.8K关注 0票数 9

我有一个go程序应该调用一个红宝石脚本。

我有一个runCommand函数:

代码语言:javascript
复制
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)
    }
}

我是这样引用的:

代码语言:javascript
复制
runCommand("ruby", "-e", "require 'foo'")

它适用于大多数情况,除非在子进程中存在需要暂停输入的gets或任何类似的操作。

我尝试过设置cmd.Stdin = os.Stdin,但它不会等待输入。

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-14 13:03:04

下面的程序似乎是按你的要求做(我的runCommand几乎和你的一样。)我刚刚将=更改为err行的:=。)你在做什么不同的事吗?

代码语言:javascript
复制
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)
    }
}
票数 8
EN

Stack Overflow用户

发布于 2015-05-13 14:15:37

您可能需要使用伪端子。您可以在以下库中完成此操作:github.com/kr/pty

代码语言:javascript
复制
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
  `)
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30207035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档