// Package executor exec commands package executor import ( "fmt" "os" "os/exec" "strings" "golang.org/x/term" ) var localVars = make(map[string]string) func BuildExecutor(oldStateTerminal *term.State, fd *int) func(string) { return func(line string) { line = strings.TrimSpace(line) if strings.Contains(line, "=") && !strings.HasPrefix(line, "export ") { parts := strings.SplitN(line, "=", 2) key := strings.TrimSpace(parts[0]) value := strings.TrimSpace(parts[1]) localVars[key] = value return } line = os.Expand(line, GetVariable) if line == "" { return } args := strings.Fields(line) command := args[0] commandArgs := args[1:] if command == "exit" { fmt.Println("Bye Bye my small deer :3") if oldStateTerminal != nil { _ = term.Restore(*fd, oldStateTerminal) } os.Exit(0) } if command == "cd" { if len(commandArgs) < 1 { fmt.Fprintln(os.Stderr, "cd: argument was skipped") return } if err := os.Chdir(commandArgs[0]); err != nil { fmt.Fprintln(os.Stderr, err) } return } cmd := exec.Command(command, commandArgs...) cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { fmt.Fprintf(os.Stderr, "Execution error: %v\n", err) } } } func GetVariable(key string) string { if val, exists := localVars[key]; exists { return val } if val := os.Getenv(key); val != "" { return val } return "" }