Golang 交互式 Shell Demo
大约 1 分钟
使用 golang 创建一个简单的交互式 Shell 程序。
基本程序
这里我们需要使用到 bufio
和系统 os
的输入输出。
首先使用了 bufio
读取系统的输入:
reader := bufio.NewReader(os.Stdin)
cmdString, err := reader.ReadString('\n')
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
当读取到换行时,表示当前读取结束,并将读取到的内容赋值给 cmdString
,然后使用 exec
包来执行命令:
cmdString = strings.TrimSuffix(t, "\n")
cmd := exec.Command(cmdString)
// 将命令的执行的输出到控制台
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
// 执行命令
err = cmd.Run()
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
这样整个程序就基本完成了,然后我们将上述的两个代码块放到一个循环中就实现了一个简单的交互 Shell 程序了。在下述的完整代码中添加了退出命令 quit
和 exit
,当然也可以之用使用 ctrl + c
退出。
完整代码如下:
package main
import (
"bufio"
"fmt"
"os"
"os/exec"
"strings"
)
func main() {
main:
for {
fmt.Print(">>> ")
reader := bufio.NewReader(os.Stdin)
cmdString, err := reader.ReadString('\n')
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
cmdString = strings.TrimSuffix(cmdString, "\n")
// 是否退出程序
if strings.EqualFold(cmdString, "quit") || strings.EqualFold(cmdString, "exit") {
fmt.Fprintln(os.Stdout, cmdString)
break main
}
cmd := exec.Command(cmdString)
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
err = cmd.Run()
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
}
}