// 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)
}