如何暂停一个程序?

时间:2013-08-15 15:51:49

标签: linux windows shell go

我想实现{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语言本身实现暂停功能?

4 个答案:

答案 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+ZCtrl+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")