projects:script_launcher_bh
Различия
Показаны различия между двумя версиями страницы.
| projects:script_launcher_bh [2025/03/26 19:04] – создано - внешнее изменение 127.0.0.1 | projects:script_launcher_bh [2025/03/27 00:16] (текущий) – удалено | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | ===== Script Launcher ===== | ||
| - | **Linux** | ||
| - | Скрипты далее перебирают все скрипты '' | ||
| - | и отбирают те в которых есть ''# | ||
| - | |||
| - | <code bash> | ||
| - | #!/bin/bash | ||
| - | # ==AUTOEXEC== | ||
| - | # === Название программы === | ||
| - | # * Строка для основного описания | ||
| - | # * Строки для развернутого описания | ||
| - | # * Строки для развернутого описания | ||
| - | # // | ||
| - | # | ||
| - | |||
| - | |||
| - | </ | ||
| - | |||
| - | признаком окончания описания является первая первая найденная строка где кроме ''#'' | ||
| - | |||
| - | ==== Шаблон скрипта ==== | ||
| - | Шаблон оформления скрипта для применения в лаунчере\\ | ||
| - | Дополнительно сделан шаблон меню с выбором пунктов | ||
| - | |||
| - | ++++Шаблон файла с заголовками для использования в лаунчере (нажмите чтобы раскрыть)| | ||
| - | <file bash template.sh> | ||
| - | #!/bin/bash | ||
| - | # ==AUTOEXEC== | ||
| - | # === Шаблон меню для нового скрипта === | ||
| - | # * Основной шаблон bash-скрипта с пунктами меню и выходом по 0 | ||
| - | # * Добавьте сюда свои действия и команды | ||
| - | # | ||
| - | |||
| - | |||
| - | PS3=" | ||
| - | echo " 0) ❌ Выход" | ||
| - | select action in "📂 Действие 1" " | ||
| - | if [[ " | ||
| - | echo "👋 До свидания!" | ||
| - | exit 0 | ||
| - | fi | ||
| - | case $REPLY in | ||
| - | 1) | ||
| - | echo "👉 Выполняем Действие 1" | ||
| - | # ваша команда здесь | ||
| - | ;; | ||
| - | 2) | ||
| - | echo "🔧 Выполняем Действие 2" | ||
| - | # ваша команда здесь | ||
| - | ;; | ||
| - | 3) | ||
| - | echo "👋 До свидания!" | ||
| - | exit 0 | ||
| - | ;; | ||
| - | *) | ||
| - | echo "❗ Неверный выбор";; | ||
| - | esac | ||
| - | break | ||
| - | |||
| - | done | ||
| - | |||
| - | exit 0 | ||
| - | |||
| - | </ | ||
| - | |||
| - | |||
| - | |||
| - | ==== Лаунчер скриптов (с оболочкой fzf) ==== | ||
| - | |||
| - | При запуске можно выбрать fzf меню или средствами bash скрипта | ||
| - | Еслы был выбор fzf но он не установлен, | ||
| - | |||
| - | ++++Скрипт для поиска и запуска скрптов из подкаталогов при помощи утилиты fzf (нажмите чтобы раскрыть)| | ||
| - | <file bash launcher_fzf.sh> | ||
| - | #!/bin/bash | ||
| - | export LANG=en_US.UTF-8 | ||
| - | export LC_ALL=en_US.UTF-8 | ||
| - | |||
| - | INCLUDE_MARKER="# | ||
| - | ROOT_DIR=" | ||
| - | TMP_LIST="/ | ||
| - | SELECTED_FILE="" | ||
| - | |||
| - | # --- Проверка fzf --- | ||
| - | HAS_FZF=false | ||
| - | if command -v fzf &>/ | ||
| - | HAS_FZF=true | ||
| - | fi | ||
| - | |||
| - | # --- Сбор скриптов (.sh и .py 'по умолчанию отключено' | ||
| - | > " | ||
| - | find " | ||
| - | if grep -q " | ||
| - | TITLE="" | ||
| - | SHORT="" | ||
| - | while IFS= read -r line; do | ||
| - | [[ -z " | ||
| - | if [[ " | ||
| - | CLEANED=" | ||
| - | if [[ " | ||
| - | TITLE=" | ||
| - | elif [[ " | ||
| - | SHORT=" | ||
| - | fi | ||
| - | fi | ||
| - | done < <(tail -n +2 <(grep -A30 " | ||
| - | |||
| - | DISPLAY_LINE=" | ||
| - | echo -e " | ||
| - | fi | ||
| - | done | ||
| - | |||
| - | if [ ! -s " | ||
| - | echo "❌ Не найдено подходящих скриптов." | ||
| - | exit 1 | ||
| - | fi | ||
| - | |||
| - | # --- Выбор интерфейса запуска --- | ||
| - | while true; do | ||
| - | echo " | ||
| - | echo " 1) fzf-интерфейс $( [ " | ||
| - | echo " 2) Классическое текстовое меню" | ||
| - | echo " 0) Выход" | ||
| - | echo -n ">> | ||
| - | read -r launcher_mode | ||
| - | |||
| - | case " | ||
| - | 1) | ||
| - | if [ " | ||
| - | SELECTED_LINE=$(cat " | ||
| - | fzf --prompt=" | ||
| - | --preview=' | ||
| - | [ -f " | ||
| - | --preview-window=right: | ||
| - | |||
| - | if [ -z " | ||
| - | echo "❎ Отмена пользователем." | ||
| - | rm -f " | ||
| - | exit 0 | ||
| - | fi | ||
| - | SELECTED_FILE=$(echo " | ||
| - | break | ||
| - | else | ||
| - | echo " | ||
| - | echo " | ||
| - | launcher_mode=2 | ||
| - | fi | ||
| - | ;; | ||
| - | 2) | ||
| - | echo "📜 Найденные скрипты:" | ||
| - | echo " 0) ❌ Выход" | ||
| - | echo | ||
| - | mapfile -t ENTRIES < <(cut -d' | ||
| - | ENTRIES+=(" | ||
| - | |||
| - | PS3=" | ||
| - | select ENTRY in " | ||
| - | if [[ " | ||
| - | echo "👋 До свидания!"; | ||
| - | fi | ||
| - | [ -z " | ||
| - | SELECTED_FILE=$(grep -F " | ||
| - | break 2 | ||
| - | done | ||
| - | ;; | ||
| - | 0) | ||
| - | echo "👋 До свидания!" | ||
| - | rm -f " | ||
| - | exit 0 | ||
| - | ;; | ||
| - | *) | ||
| - | echo "❌ Неверный выбор" | ||
| - | ;; | ||
| - | esac | ||
| - | done | ||
| - | |||
| - | # --- Подтверждение и запуск --- | ||
| - | echo " | ||
| - | echo " | ||
| - | read -r confirm | ||
| - | if [[ " | ||
| - | echo "🚀 Запуск..." | ||
| - | EXT=" | ||
| - | case " | ||
| - | sh) bash " | ||
| - | # py) python3 " | ||
| - | *) echo "❌ Неизвестный тип файла: $EXT" ;; | ||
| - | esac | ||
| - | else | ||
| - | echo "❎ Отмена." | ||
| - | fi | ||
| - | |||
| - | rm -f " | ||
| - | |||
| - | </ | ||
| - | |||
| - | ===== Ver 2 ===== | ||
| - | |||
| - | ++++Лаунчер| | ||
| - | <code bash launcher.sh> | ||
| - | #!/bin/bash | ||
| - | |||
| - | # Устанавливаем локаль, | ||
| - | export LANG=en_US.UTF-8 | ||
| - | export LC_ALL=en_US.UTF-8 | ||
| - | |||
| - | # Маркер, | ||
| - | INCLUDE_MARKER="# | ||
| - | |||
| - | # Текущий рабочий каталог, | ||
| - | ROOT_DIR=" | ||
| - | |||
| - | # Создаём уникальный временный файл для хранения списка скриптов | ||
| - | TMP_LIST=$(mktemp / | ||
| - | |||
| - | # Удалим временный файл при завершении скрипта — в любом случае | ||
| - | trap "rm -f ' | ||
| - | |||
| - | # Переменная для хранения выбранного файла | ||
| - | SELECTED_FILE="" | ||
| - | |||
| - | # --- Проверка наличия fzf --- | ||
| - | HAS_FZF=false | ||
| - | if command -v fzf &>/ | ||
| - | HAS_FZF=true | ||
| - | fi | ||
| - | |||
| - | # --- Сбор скриптов (.sh; поддержка .py отключена по умолчанию) --- | ||
| - | > " | ||
| - | find " | ||
| - | if grep -q " | ||
| - | TITLE="" | ||
| - | SHORT="" | ||
| - | # Чтение заголовка и краткого описания из комментариев после маркера | ||
| - | while IFS= read -r line; do | ||
| - | [[ -z " | ||
| - | if [[ " | ||
| - | CLEANED=" | ||
| - | if [[ " | ||
| - | TITLE=" | ||
| - | elif [[ " | ||
| - | SHORT=" | ||
| - | fi | ||
| - | fi | ||
| - | done < <(tail -n +2 <(grep -A30 " | ||
| - | |||
| - | DISPLAY_LINE=" | ||
| - | echo -e " | ||
| - | fi | ||
| - | done | ||
| - | |||
| - | # Если список скриптов пуст — выходим | ||
| - | if [ ! -s " | ||
| - | echo "❌ Не найдено подходящих скриптов." | ||
| - | exit 1 | ||
| - | fi | ||
| - | |||
| - | # --- Выбор интерфейса запуска --- | ||
| - | while true; do | ||
| - | echo -e " | ||
| - | echo " 1) fzf-интерфейс $( [ " | ||
| - | echo " 2) Классическое текстовое меню" | ||
| - | echo " 0) Выход" | ||
| - | echo -n ">> | ||
| - | read -r launcher_mode | ||
| - | |||
| - | case " | ||
| - | 1) | ||
| - | if [ " | ||
| - | # fzf с предпросмотром описания из скрипта | ||
| - | SELECTED_LINE=$(cat " | ||
| - | fzf --prompt=" | ||
| - | --preview=' | ||
| - | [ -f " | ||
| - | --preview-window=right: | ||
| - | |||
| - | # Отмена выбора | ||
| - | if [ -z " | ||
| - | echo "❎ Отмена пользователем." | ||
| - | exit 0 | ||
| - | fi | ||
| - | SELECTED_FILE=$(echo " | ||
| - | break | ||
| - | else | ||
| - | echo " | ||
| - | echo " | ||
| - | launcher_mode=2 | ||
| - | fi | ||
| - | ;; | ||
| - | 2) | ||
| - | echo "📜 Найденные скрипты:" | ||
| - | echo " 0) ❌ Выход" | ||
| - | echo | ||
| - | mapfile -t ENTRIES < <(cut -d' | ||
| - | ENTRIES+=(" | ||
| - | |||
| - | PS3=" | ||
| - | select ENTRY in " | ||
| - | if [[ " | ||
| - | echo "👋 До свидания!" | ||
| - | exit 0 | ||
| - | fi | ||
| - | [ -z " | ||
| - | SELECTED_FILE=$(grep -F " | ||
| - | break 2 | ||
| - | done | ||
| - | ;; | ||
| - | 0) | ||
| - | echo "👋 До свидания!" | ||
| - | exit 0 | ||
| - | ;; | ||
| - | *) | ||
| - | echo "❌ Неверный выбор" | ||
| - | ;; | ||
| - | esac | ||
| - | done | ||
| - | |||
| - | # --- Подтверждение и запуск --- | ||
| - | echo -e " | ||
| - | echo " | ||
| - | read -r confirm | ||
| - | if [[ " | ||
| - | echo "🚀 Запуск..." | ||
| - | EXT=" | ||
| - | case " | ||
| - | sh) bash " | ||
| - | # py) python3 " | ||
| - | *) echo "❌ Неизвестный тип файла: $EXT" ;; | ||
| - | esac | ||
| - | else | ||
| - | echo "❎ Отмена." | ||
| - | fi | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== Описание ===== | ||
| - | ++++script_launcher| | ||
| - | <code md script_launcher.md> | ||
| - | # Script Launcher | ||
| - | |||
| - | Утилита для запуска локальных скриптов с использованием системы тегов и интерфейса выбора. Поддерживает интерактивный выбор через `fzf` (если установлен) или текстовое меню. Разрабатывается для работы в рамках одного каталога, | ||
| - | |||
| - | --- | ||
| - | |||
| - | ## 📦 Возможности | ||
| - | |||
| - | - Поиск всех `.sh`-файлов в текущем каталоге | ||
| - | - Отбор скриптов только с маркером `# ==AUTOEXEC==` | ||
| - | - Чтение заголовка (вида `# === Название ===`) и краткого описания (`# * краткое описание`) | ||
| - | - Поддержка интерфейса выбора через `fzf` с предпросмотром описания | ||
| - | - Альтернатива — классическое текстовое меню Bash | ||
| - | - Подтверждение перед запуском | ||
| - | - Поддержка временных файлов через `mktemp` с автоудалением (`trap`) | ||
| - | |||
| - | --- | ||
| - | |||
| - | ## 🔧 Требования | ||
| - | |||
| - | - Bash 4+ | ||
| - | - [fzf](https:// | ||
| - | |||
| - | Установка fzf: | ||
| - | ```bash | ||
| - | sudo apt update && sudo apt install -y fzf | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | ## 🧠 Структура | ||
| - | |||
| - | Скрипты должны содержать специальную метку `# ==AUTOEXEC==`, | ||
| - | |||
| - | ```bash | ||
| - | # ==AUTOEXEC== | ||
| - | # === Название скрипта === | ||
| - | # * Краткое описание или цель | ||
| - | ``` | ||
| - | |||
| - | Пример: | ||
| - | ```bash | ||
| - | # ==AUTOEXEC== | ||
| - | # === Сохранить резервную копию === | ||
| - | # * Создаёт .tar.gz архив с логированием | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | ## 🚀 Запуск | ||
| - | |||
| - | Сначала выполните `launcher.sh` из нужного каталога: | ||
| - | ```bash | ||
| - | bash launcher.sh | ||
| - | ``` | ||
| - | - У меня настроен алиас на высов скрипта ' | ||
| - | |||
| - | |||
| - | Выберите интерфейс: | ||
| - | 1. fzf-интерфейс (если доступен) | ||
| - | 2. Классическое меню | ||
| - | 0. Выход | ||
| - | |||
| - | Выбранный скрипт запускается **только после подтверждения**. | ||
| - | |||
| - | --- | ||
| - | |||
| - | ## 🔐 Безопасность и устойчивость | ||
| - | |||
| - | - Временные файлы создаются через `mktemp`, исключая конфликты при параллельном запуске | ||
| - | - Удаляются автоматически через `trap EXIT` | ||
| - | - Нет выполнения кода без согласия пользователя | ||
| - | - Нет внешних сетевых обращений | ||
| - | |||
| - | --- | ||
| - | |||
| - | ## 📁 Планы на будущее | ||
| - | |||
| - | - Опциональная поддержка `.py`-файлов | ||
| - | - Флаги запуска (`--py`, `--no-preview` и т.п.) | ||
| - | - Категории или теги | ||
| - | - Логирование запусков | ||
| - | |||
| - | --- | ||
| - | |||
| - | Дата обновления: | ||
| - | |||
| - | |||
| - | </ | ||
| - | ++++ | ||
projects/script_launcher_bh.1743005097.txt.gz · Последнее изменение: — 127.0.0.1
