// Package executor exec commands package executor import ( "errors" "os/exec" "os" "strings" ) var ErrBuiltInExit = errors.New("exit command") var localVars = make(map[string]string) func PrepareCommand(in string) (*exec.Cmd, error) { in = strings.TrimSpace(in) if in == "" { return nil, nil } if strings.Contains(in, "=") && !strings.HasPrefix(in, "export ") { parts := strings.SplitN(in, "=", 2) key := strings.TrimSpace(parts[0]) value := strings.TrimSpace(parts[1]) localVars[key] = value return nil,nil } in = os.Expand(in, GetVariable) parts := strings.Fields(in) head := parts[0] args := parts[1:] switch head { case "exit": return nil, ErrBuiltInExit case "help": return exec.Command("echo", "noko-shell: available commands: any system command, help, exit"), nil } // Поиск системной утилиты в PATH (авто-проверка на существование) fullPath, err := exec.LookPath(head) if err != nil { return nil, err } // Возвращаем подготовленный процесс return exec.Command(fullPath, args...), nil } func GetVariable(key string) string { if val, exists := localVars[key]; exists { return val } if val := os.Getenv(key); val != "" { return val } return "" }