first commit
This commit is contained in:
205
internal/shell/commands.go
Normal file
205
internal/shell/commands.go
Normal file
@@ -0,0 +1,205 @@
|
||||
// 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 <dir>", ansi.BrightWhite), "Создать новую директорию")
|
||||
fmt.Printf(" %-15s %s\n", ansi.Colorize("rm <file>", ansi.BrightWhite), "Удалить файл или директорию")
|
||||
fmt.Printf(" %-15s %s\n", ansi.Colorize("touch <file>", ansi.BrightWhite), "Создать файл или обновить время доступа")
|
||||
fmt.Printf(" %-15s %s\n", ansi.Colorize("exec <cmd> [args...]", ansi.BrightWhite), "Выполнить внешнюю команду")
|
||||
|
||||
fmt.Println()
|
||||
ansi.Println(ansi.Yellow, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
|
||||
ansi.Println(ansi.BrightGreen, "ВНЕШНИЕ КОМАНДЫ:")
|
||||
ansi.Println(ansi.Yellow, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
|
||||
|
||||
fmt.Printf(" %-15s %s\n", ansi.Colorize("<program>", ansi.BrightWhite), "Запуск любого внешнего приложения")
|
||||
fmt.Printf(" %-15s %s\n", ansi.Colorize("<lua_script>", 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)
|
||||
}
|
||||
Reference in New Issue
Block a user