使用golang实现一个简单的shell
主要依赖golang的bufio模块来获取用户输入命令,使用exec来执行并在stdout中返回结果。
package main
import (
"bufio"
"errors"
"fmt"
"os"
"os/exec"
"regexp"
"strings"
)
// 声明两个新的错误返回
var ErrNotPath = errors.New("Path Required")
var ErrRegexp = errors.New("Regexp Fail")
func execShell(input string) error {
// 去除输入中最后的换行
input = strings.TrimSuffix(input, "\n")
// 去除输入前后的空格
input = strings.TrimSpace(input)
// 正则匹配输入字符中连续多个空格替换为一个空格
r, err := regexp.Compile(" +")
if err != nil {
return ErrRegexp
}
input = r.ReplaceAllString(input, " ")
args := strings.Split(input, " ")
// 判断用户输入是否为cd
switch args[0] {
case "cd":
if len(args) < 2 {
return ErrNotPath
}
return os.Chdir(args[1])
case "exit":
os.Exit(0)
}
cmd := exec.Command(args[0], args[1:]...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
func main() {
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print("> ")
input, err := reader.ReadString('\n')
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
if err = execShell(input); err != nil {
fmt.Fprintln(os.Stderr, err)
}
}
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END