如何使用Golang | Go实现一个简单的shell?

使用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)
		}
	}
}

复制代码

参考连接:sj14.gitlab.io/post/2018/0…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享