Инструменты пользователя

Инструменты сайта


projects:script_launcher_bh

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

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

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution 4.0 International
CC Attribution 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki