为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
萧十郎 2021-12-07 14:50:20
我尝试使用基本的 bash 命令read从键盘捕获单个字符。但是即使我尝试了多种方法,似乎也很难获得输出。示例代码:fmt.Println(exec.Command("read", "-t", "5", "-n", "1").Output())它的意思是“等待 5 秒从键盘获取 1 个输入字符”。从上面的代码中,我希望看到我的输入字符与其错误一起打印出来,但我得到的是输出:[] exit status 1此输出仅在不到 1 秒的时间内立即打印,这与代表等待 5 秒"-t", "5"的read命令参数冲突。我尝试在 1 秒内输入一些字符,但似乎根本不起作用。顺便说一句,如果试试这个fmt.Println(exec.Command("echo", "\"Hi!\"").Output())输出:[34 104 105 34 10] <nil>在这里似乎在这里工作很简单echo。
查看完整描述

1 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

您没有提供带有 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脚本不会打印任何内容。您可能希望在 shellread的上下文中调用内置的 shell。这将打印字符读取:


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

cmd.Stdin = os.Stdin

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


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信