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






















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)
