2016-01-20 171 views
1

我试图使用基本bash命令read从键盘捕获单个字符。但是,即使我尝试了几种方法,也很难获得输出结果。无法从Golang运行bash`read`命令

示例代码:

fmt.Println(exec.Command("read", "-t", "5", "-n", "1").Output()) 

它的意思是“等待5秒钟就可以从键盘1个输入字符”。从上面的代码我希望看到我输入的字符一起打印出来与它的错误,但我会得到什么是

输出:

[] exit status 1 

这个输出只是立即较小超过1秒,其冲突到"-t", "5"印刷指示等待5秒钟的指令read。我尝试在1秒内键入一些字符,但似乎根本不起作用。

顺便说一句,如果尝试这种

fmt.Println(exec.Command("echo", "\"Hi!\"").Output()) 

输出:

[34 104 105 34 10] <nil> 

在这里简单echo在这里似乎工作。

+0

阅读是一个bash命令,而不是您的PATH中的可执行文件,如echo。也许调用内部bash的内容可能会起作用。我建议找一个Go-Only解决方案。 – Volker

+0

@Volker我只是想捕获'空格键'这就是全部。你有任何建议,只需一个简单的唯一解决方案? – fronthem

回答

1

你不提供带有标准输入的命令,所以没有任何东西可以读取并立即退出。

如果你想要把它挂在同一标准输入作为调用程序,你可以使用:

cmd := exec.Command("read", "-t", "5", "-n", "1") 
cmd.Stdin = os.Stdin 
out, err := cmd.CombinedOutput() 

fmt.Println("error:", err) 
fmt.Printf("output: %q\n", out) 

然而,这不会输出任何东西,因为/usr/bin/read脚本是不会打印出任何东西。您可能想要在shell的上下文中调用shell内建的read。这会打印出读到的字符:

cmd := exec.Command("bash", "-c", "read -t 5 -n 1 C && echo -n $C") 
cmd.Stdin = os.Stdin 

但最后,您应该直接从stdin中读取。

+0

感谢您的回答@JimB。我试过了你的代码,听起来不错,但是我每次输入都从“out”中得到“”。 – fronthem

+0

@ terces907:这是因为'read'不打印任何输出。你想做什么? – JimB

+0

我只想得到给定的输入字符。 – fronthem