无法从Golang运行bash`read`命令

时间:2016-01-20 16:10:53

标签: go exec stdin

我尝试使用基本bash命令read从键盘捕获单个字符。但即使我尝试了几种方法,似乎很难获得输出。

示例代码:

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

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

输出:

[] exit status 1

此输出仅在小于1秒的时间内立即打印,与"-t", "5"命令的read参数冲突,该命令代表等待5秒。我尝试在1秒内输入一些字符但看起来根本不起作用。

BTW,如果试试这个

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

输出:

[34 104 105 34 10] <nil>

这里的工作似乎很简单echo

1 个答案:

答案 0 :(得分:1)

你没有提供带有stdin的命令,因此没有什么可以读取它立即退出。

如果你想将它与调用程序挂起相同的stdin,你可以使用:

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的上下文中调用内置read的shell。这将打印出读取的字符:

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

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