// commands.go - встроенные команды fush shell // Реализует базовые команды: exit, ls, cd, mkdir, rm, touch, exec, help // Обеспечивает навигацию по файловой системе и управление файлами // Служит основой для расширения функциональности shell package shell import ( "fmt" "os" "time" "fush/pkg/ansi" ) // cmdExit обрабатывает команду exit func (s *Shell) cmdExit(args []string) error { s.running.Store(false) s.logger.Info("Выполнена команда exit") return nil } // cmdHelp обрабатывает команду help - выводит список доступных команд func (s *Shell) cmdHelp(args []string) error { fmt.Println() ansi.Println(ansi.Cyan, "╔══════════════════════════════════════════════════════════════╗") ansi.Println(ansi.Cyan, "║ fush shell - Доступные команды ║") ansi.Println(ansi.Cyan, "╚══════════════════════════════════════════════════════════════╝") fmt.Println() // Внутренние команды ansi.Println(ansi.Yellow, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") ansi.Println(ansi.BrightGreen, "ВСТРОЕННЫЕ КОМАНДЫ:") ansi.Println(ansi.Yellow, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") fmt.Printf(" %-15s %s\n", ansi.Colorize("exit", ansi.BrightWhite), "Выход из оболочки") fmt.Printf(" %-15s %s\n", ansi.Colorize("help", ansi.BrightWhite), "Показать эту справку") fmt.Printf(" %-15s %s\n", ansi.Colorize("ls [path]", ansi.BrightWhite), "Вывести список файлов в директории") fmt.Printf(" %-15s %s\n", ansi.Colorize("cd [dir]", ansi.BrightWhite), "Сменить текущую директорию") fmt.Printf(" %-15s %s\n", ansi.Colorize("mkdir ", ansi.BrightWhite), "Создать новую директорию") fmt.Printf(" %-15s %s\n", ansi.Colorize("rm ", ansi.BrightWhite), "Удалить файл или директорию") fmt.Printf(" %-15s %s\n", ansi.Colorize("touch ", ansi.BrightWhite), "Создать файл или обновить время доступа") fmt.Printf(" %-15s %s\n", ansi.Colorize("exec [args...]", ansi.BrightWhite), "Выполнить внешнюю команду") fmt.Println() ansi.Println(ansi.Yellow, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") ansi.Println(ansi.BrightGreen, "ВНЕШНИЕ КОМАНДЫ:") ansi.Println(ansi.Yellow, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") fmt.Printf(" %-15s %s\n", ansi.Colorize("", ansi.BrightWhite), "Запуск любого внешнего приложения") fmt.Printf(" %-15s %s\n", ansi.Colorize("", ansi.BrightWhite), "Выполнение Lua скрипта из директории ~/.local/share/fush/lua/") fmt.Println() ansi.Println(ansi.Yellow, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") ansi.Println(ansi.BrightGreen, "СПЕЦИАЛЬНЫЕ ВОЗМОЖНОСТИ:") ansi.Println(ansi.Yellow, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") fmt.Printf(" %-20s %s\n", ansi.Colorize("cmd1 | cmd2", ansi.BrightWhite), "Пайплайн (канал) между командами") fmt.Printf(" %-20s %s\n", ansi.Colorize("cmd > file", ansi.BrightWhite), "Перенаправление вывода в файл (перезапись)") fmt.Printf(" %-20s %s\n", ansi.Colorize("cmd >> file", ansi.BrightWhite), "Перенаправление вывода в файл (добавление)") fmt.Printf(" %-20s %s\n", ansi.Colorize("Lua API", ansi.BrightWhite), "Встроенный интерпретатор Lua с функциями: exec(), ls(), cd(), pwd()") fmt.Println() ansi.Println(ansi.Yellow, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") ansi.Println(ansi.BrightGreen, "ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ:") ansi.Println(ansi.Yellow, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") ansi.Println(ansi.BrightCyan, "ВСТРОЕННЫЕ КОМАНДЫ:") fmt.Printf(" %-40s %s\n", ansi.Colorize("ls -la", ansi.BrightWhite), "Показать все файлы в текущей директории") fmt.Printf(" %-40s %s\n", ansi.Colorize("cd /home/user", ansi.BrightWhite), "Перейти в директорию пользователя") fmt.Printf(" %-40s %s\n", ansi.Colorize("mkdir mydir", ansi.BrightWhite), "Создать директорию 'mydir'") fmt.Printf(" %-40s %s\n", ansi.Colorize("rm myfile.txt", ansi.BrightWhite), "Удалить файл 'myfile.txt'") fmt.Printf(" %-40s %s\n", ansi.Colorize("touch newfile.txt", ansi.BrightWhite), "Создать файл 'newfile.txt'") fmt.Printf(" %-40s %s\n", ansi.Colorize("exec go version", ansi.BrightWhite), "Выполнить команду 'go version'") fmt.Println() ansi.Println(ansi.BrightCyan, "ВНЕШНИЕ КОМАНДЫ (СИСТЕМНЫЕ УТИЛИТЫ):") fmt.Printf(" %-40s %s\n", ansi.Colorize("go version", ansi.BrightWhite), "Показать версию Go (если установлен)") fmt.Printf(" %-40s %s\n", ansi.Colorize("python --version", ansi.BrightWhite), "Показать версию Python (если установлен)") fmt.Printf(" %-40s %s\n", ansi.Colorize("gcc --version", ansi.BrightWhite), "Показать версию GCC (если установлен)") fmt.Printf(" %-40s %s\n", ansi.Colorize("date", ansi.BrightWhite), "Показать текущую дату и время") fmt.Printf(" %-40s %s\n", ansi.Colorize("whoami", ansi.BrightWhite), "Показать имя текущего пользователя") fmt.Printf(" %-40s %s\n", ansi.Colorize("pwd", ansi.BrightWhite), "Показать текущую рабочую директорию") fmt.Printf(" %-40s %s\n", ansi.Colorize("echo Hello World", ansi.BrightWhite), "Вывести текст на экран") fmt.Printf(" %-40s %s\n", ansi.Colorize("cat file.txt", ansi.BrightWhite), "Показать содержимое файла") fmt.Printf(" %-40s %s\n", ansi.Colorize("grep pattern file.txt", ansi.BrightWhite), "Поиск строк по шаблону в файле") fmt.Println() ansi.Println(ansi.BrightCyan, "КОМАНДЫ ДЛЯ РАБОТЫ С ПАЙПЛАЙНАМИ (КАНАЛАМИ):") fmt.Printf(" %-40s %s\n", ansi.Colorize("ls -la | grep .go", ansi.BrightWhite), "Показать только Go файлы в текущей директории") fmt.Printf(" %-40s %s\n", ansi.Colorize("ps aux | grep python", ansi.BrightWhite), "Найти процессы Python") fmt.Printf(" %-40s %s\n", ansi.Colorize("cat file.txt | wc -l", ansi.BrightWhite), "Подсчитать количество строк в файле") fmt.Printf(" %-40s %s\n", ansi.Colorize("ls | sort | uniq", ansi.BrightWhite), "Отсортировать и убрать дубликаты") fmt.Println() ansi.Println(ansi.BrightCyan, "ПЕРЕНАПРАВЛЕНИЕ ВЫВОДА:") fmt.Printf(" %-40s %s\n", ansi.Colorize("ls > files.txt", ansi.BrightWhite), "Сохранить список файлов в files.txt (перезапись)") fmt.Printf(" %-40s %s\n", ansi.Colorize("echo Hello >> hello.txt", ansi.BrightWhite), "Добавить текст в конец файла") fmt.Printf(" %-40s %s\n", ansi.Colorize("go version > version.txt", ansi.BrightWhite), "Сохранить версию Go в файл") fmt.Println() ansi.Println(ansi.BrightCyan, "LUA СКРИПТЫ:") fmt.Printf(" %-40s %s\n", ansi.Colorize("example.lua", ansi.BrightWhite), "Выполнить Lua скрипт из директории ~/.local/share/fush/lua/") fmt.Printf(" %-40s %s\n", ansi.Colorize("my_script.lua arg1 arg2", ansi.BrightWhite), "Выполнить Lua скрипт с аргументами") fmt.Println() ansi.Println(ansi.Yellow, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") ansi.Println(ansi.BrightCyan, "Для выхода из оболочки введите 'exit' или нажмите Ctrl+C") fmt.Println() return nil } // cmdLs обрабатывает команду ls func (s *Shell) cmdLs(args []string) error { // Определяем путь path := "." if len(args) > 0 { path = args[0] } // Открываем директорию dir, err := os.Open(path) if err != nil { return err } defer dir.Close() // Читаем содержимое files, err := dir.Readdir(-1) if err != nil { return err } // Выводим список for _, file := range files { name := file.Name() if file.IsDir() { name = name + "/" } fmt.Println(name) } return nil } // cmdCd обрабатывает команду cd func (s *Shell) cmdCd(args []string) error { // Определяем путь path := s.GetEnv("HOME") if len(args) > 0 { path = args[0] } // Меняем директорию if err := os.Chdir(path); err != nil { return err } // Обновляем PWD pwd, err := os.Getwd() if err == nil { s.SetEnv("PWD", pwd) } return nil } // cmdMkdir обрабатывает команду mkdir func (s *Shell) cmdMkdir(args []string) error { if len(args) == 0 { return fmt.Errorf("требуется имя директории") } // Создаем директорию return os.MkdirAll(args[0], 0755) } // cmdRm обрабатывает команду rm func (s *Shell) cmdRm(args []string) error { if len(args) == 0 { return fmt.Errorf("требуется имя файла") } // Удаляем файл или директорию return os.RemoveAll(args[0]) } // cmdTouch обрабатывает команду touch func (s *Shell) cmdTouch(args []string) error { if len(args) == 0 { return fmt.Errorf("требуется имя файла") } // Создаем файл или обновляем время модификации file, err := os.OpenFile(args[0], os.O_CREATE|os.O_WRONLY, 0644) if err != nil { return err } defer file.Close() // Обновляем время модификации now := time.Now() return os.Chtimes(args[0], now, now) }