我正在为 Go 中的 CLI 编写向导。我想做的是询问用户他想做什么,准备适当的 CLI 命令,并将其写入控制台。然后,用户可能会在先编辑它之后通过按 Enter 将命令提交到 CLI。换句话说,我想将输出写入标准输出,当用户按 Enter 时,该输出将成为标准输入的输入。有没有办法在 Go 中做到这一点?
问问题
1438 次
2 回答
1
直接从用户获取输入:
var s string
_, err := fmt.Scanf("%s", &s)
对于类似诅咒的应用程序,请看这里: https ://github.com/rthornton128/goncurses/blob/master/ncurses.go
它具有 C 绑定。
于 2015-06-25T09:32:47.503 回答
0
我找到了一个 Go 命令行编辑器包https://github.com/peterh/liner,它包含了所需的功能以及更多功能。它允许您编写具有历史记录和命令完成的 CLI,命令完成功能提供了我在问题中所要求的内容:它显示了用户可以编辑并提交给 CLI 的文本。它支持 Windows、Linux 和 Mac。这是其 README 中示例的略微修改版本,它运行带有命令完成功能的简单 CLI。例如,用户可以键入“j”并按 Tab 键循环浏览名称列表,编辑其中一个以品尝,然后按 Enter 提交。
package main
import (
"fmt"
"log"
"os"
"strings"
"github.com/peterh/liner"
)
var (
history_fn = ".liner_history"
names = []string{"jack", "john", "james", "mary", "mike", "nancy"}
)
func main() {
line := liner.NewLiner()
defer line.Close()
line.SetCompleter(func(line string) (c []string) {
for _, n := range names {
if strings.HasPrefix(n, strings.ToLower(line)) {
c = append(c, n)
}
}
return
})
if f, err := os.Open(history_fn); err == nil {
line.ReadHistory(f)
f.Close()
}
line.SetCtrlCAborts(true)
for true {
if name, err := line.Prompt("What is your name? "); err != nil {
if err.Error() == "EOF" || err == liner.ErrPromptAborted {
break
}
log.Print("Error reading line: ", err)
} else {
log.Print("Got: ", name)
line.AppendHistory(name)
}
}
fmt.Printf("End of test\n")
if f, err := os.Create(history_fn); err != nil {
log.Print("Error writing history file: ", err)
} else {
line.WriteHistory(f)
f.Close()
}
}
于 2015-07-10T16:24:25.417 回答