3 回答
TA贡献1845条经验 获得超8个赞
make menuconfig我在尝试通过 golang运行 linux 时遇到了这个问题os/exec。
要完成您想要实现的目标,请尝试将其设置cmd.Stdin为os.Stdin. 这是一个工作示例:
package main
import (
"fmt"
"os"
"os/exec"
)
type cmdWithEnv struct {
pwd string
command string
cmdArgs []string
envs []string
}
func runCommand(s cmdWithEnv) error {
cmd := exec.Command(s.command, s.cmdArgs...)
if len(s.pwd) != 0 {
cmd.Dir = s.pwd
}
env := os.Environ()
env = append(env, s.envs...)
cmd.Env = env
fmt.Printf("%v\n", cmd)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Stdin = os.Stdin // setting this allowed me to interact with ncurses interface from `make menuconfig`
err := cmd.Start()
if err != nil {
return err
}
if err := cmd.Wait(); err != nil {
return err
}
return nil
}
func buildPackage() {
makeKernelConfig := cmdWithEnv{
pwd: "linux",
command: "make",
cmdArgs: []string{"-j12", "menuconfig"},
envs: []string{"CROSS_COMPILE=ccache arm-linux-gnueabihf-", "ARCH=arm"},
}
runCommand(makeKernelConfig)
}
func main() {
buildPackage()
}
TA贡献1821条经验 获得超6个赞
解决此问题的一种方法是使用命令行标志:
package main
import (
"flag"
"fmt"
"math"
)
func main() {
var (
name = flag.String("name", "John", "Enter your name.")
ip = flag.Int("ip", 12345, "What is your ip?")
)
flag.Parse()
fmt.Println("name:", *name)
fmt.Println("ip:", *ip)
}
name现在您可以使用和标志运行程序ip:
go run main.go -name="some random name" -ip=12345678910`
some random name
ip: 12345678910
TA贡献1824条经验 获得超8个赞
解决方案 1
您可以使用printf命令绕过它
cmd := "printf 'John Doe\nNew York\n35' | myInteractiveCmd"
out, err := exec.Command("bash", "-c", cmd).Output()
方案二
你可以使用io.Pipe()。Pipe creates a synchronous in-memory pipe您可以将答案写入io.Writer,您的 cmd 将从io.Reader.
r, w := io.Pipe()
cmd := exec.Command("myInteractiveCmd")
cmd.Stdin = r
go func() {
fmt.Fprintf(w, "John Doe\n")
fmt.Fprintf(w, "New York\n")
fmt.Fprintf(w, "35\n")
w.Close()
}()
cmd.Start()
cmd.Wait()
测试信息 为了对此进行测试,我编写了 cmd,它询问姓名、城市、年龄并将结果写入文件。
reader := bufio.NewReader(os.Stdin)
fmt.Print("Name: ")
name, _ := reader.ReadString('\n')
name = strings.Trim(name, "\n")
...
- 3 回答
- 0 关注
- 263 浏览
添加回答
举报