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

Can not run bash `read` command from Golang

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

示例代码:

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

其含义是"waiting for 5 seconds to get 1 input character from the keyboard"。从上面的代码中,我希望看到我的输入字符及其错误一起打印出来,但我得到的是

输出:

[] exit status 1

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

顺便说一句,如果试试这个

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

输出:

[34 104 105 34 10] <nil>

这里似乎可以用简单的echo

您没有使用 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 的上下文中调用 shell 内置函数 read。这将打印字符 read:

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

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