package main import ( "bufio" "fmt" "os" "os/signal" "strings" "gosh/cmds" "gosh/global" ) // TODO: iterate through args ahead of time to make things run better func main() { r := bufio.NewReader(os.Stdin) ch := make(chan os.Signal, 1) go func() { signal.Notify(ch) signal.Ignore(<-ch) }() for { d, _ := os.Getwd() fmt.Printf("gosh-0.1:%s$ ", abbr(d)) cmd, err := r.ReadString('\n') if err != nil && err.Error() == "EOF" { fmt.Println() continue } cmd = strings.TrimSuffix(cmd, "\n") args := strings.Split(cmd, " ") switch args[0] { case "cd": if global.ReturnCode, err = cmds.ChDir(args); err != nil { fmt.Fprintln(os.Stderr, err.Error()) } break case "export": if global.ReturnCode, err = cmds.Export(args); err != nil { fmt.Fprintln(os.Stderr, err.Error()) } break case "unset": if global.ReturnCode, err = cmds.Unset(args); err != nil { fmt.Fprintln(os.Stderr, err.Error()) } break case "set": if len(args) == 1 { cmds.PrintEnv() } else { cmds.Set(args) } break case "test", "[": if global.ReturnCode, err = cmds.Test(args); err != nil { fmt.Fprintln(os.Stderr, err.Error()) } break case "trap": if global.ReturnCode, err = cmds.Trap(args); err != nil { fmt.Fprintln(os.Stderr, err.Error()) } break case ":": global.ReturnCode = 0 err = nil break case "exit": if err = cmds.Exit(args); err != nil { fmt.Fprintln(os.Stderr, err.Error()) } break default: global.ReturnCode = cmds.External(args) break } } } func abbr(dir string) string { home, _ := os.UserHomeDir() if dir == home { return "~" } dirs := strings.Split(dir, "/") return dirs[len(dirs)-1] }