我想实现{shell}命令pause
之类的pause
函数。例如,
$ go run script.go
Any key to continue... //Then any key to continue
在Windows上,我们可以通过golang函数exec.Command()
使用系统命令。但是在Linux上怎么样?我想使用命令read -n1 -p "Any key to continue"
作为受损的命令,但它在函数exec.Command("read", "-n", "1")
中不起作用。我测试了很多,但不知道为什么。
此外,有没有人知道如何在不使用外部命令的情况下通过golang语言本身实现暂停功能?
答案 0 :(得分:6)
刚从stdin读取。用户必须按Enter才能使程序继续。或者将终端设置为“原始”模式。对于后一种情况,例如。 nsf's termbox
答案 1 :(得分:5)
从标准输入中读取一行,然后将其丢弃(source):
bio := bufio.NewReader(os.Stdin)
line, hasMoreInLine, err := bio.ReadLine()
答案 2 :(得分:0)
我不确定你是否可以这样做,如果你没有禁用除了你uncook然后终端(禁用输入缓冲)>这是simple solution到那个
这取决于操作系统,以便更好地询问用户按下输入。您还想捕获Ctrl+Z
或Ctrl+C
等信号。
c := make(chan os.Signal)
d := make(chan bool)
// Capture Control
signal.Notify(c, os.Interrupt, os.Kill)
//Capture Enter
go func() {
bio := bufio.NewReader(os.Stdin)
bio.ReadByte()
d <- true
}()
fmt.Println("Any key to continue... ")
// Block
select {
case <- d :
case <- c :
}
fmt.Println("Mission Completed")
答案 3 :(得分:0)
最后,我找到了以下方法:
在Linux Shell脚本中:
echo -ne "press any key to continue..."; stty -echo; read -n1; stty echo
在Golang for Linux中(参考:https://stackoverflow.com/a/17278730/2507321):
package main
import (
"fmt"
"os"
"os/exec"
)
func main() {
// disable input buffering
exec.Command("stty", "-F", "/dev/tty", "cbreak", "min", "1").Run()
// do not display entered characters on the screen
exec.Command("stty", "-F", "/dev/tty", "-echo").Run()
var b []byte = make([]byte, 1)
fmt.Printf("any key to continue...")
os.Stdin.Read(b)
}
在Golang for windows中:
exec.Command("cmd", "/C", "pause")