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

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


niceos:script_launcher_bh

Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
niceos:script_launcher_bh [2025/03/29 23:28] – [Ver 2] niceos:script_launcher_bh [2025/04/13 00:36] (текущий) – [Описание]
Строка 1: Строка 1:
 ===== Script Launcher ===== ===== Script Launcher =====
-**Linux**+**Linux**\\
  
-Скрипты далее перебирают все скрипты ''*.sh'' в каталоге запуска и подкаталогах, если имеет доступ+//**Проверено на Raspberry Pi4/5 OS**//\\ 
 + 
 +{{:niceos:launcher.png?nolink&|}}\\ 
 + 
 +Скрипт перебирает все скрипты ''*.sh'' в каталоге запуска и подкаталогах, если имеет доступ
 и отбирают те в которых есть ''# ==AUTOEXEC=='' и отбирают те в которых есть ''# ==AUTOEXEC==''
  
Строка 17: Строка 21:
  
 </code> </code>
 +
 +строка для основного описания будет отображена следом за названием скрипта //***.sh**// через *
  
 признаком окончания описания является первая первая найденная строка где кроме ''#'' ничего нет признаком окончания описания является первая первая найденная строка где кроме ''#'' ничего нет
Строка 73: Строка 79:
 <code bash launcher.sh> <code bash launcher.sh>
 #!/bin/bash #!/bin/bash
- 
-# Устанавливаем локаль, чтобы fzf и вывод работали корректно 
 export LANG=en_US.UTF-8 export LANG=en_US.UTF-8
 export LC_ALL=en_US.UTF-8 export LC_ALL=en_US.UTF-8
-#!/bin/bash 
 # === 🚀Лаунчер === # === 🚀Лаунчер ===
-ищет в основном каталоге и подкаталогах                                 * +# ищет в основном каталоге и подкаталогах                                 * 
-файлы *.sh с ==AUTOEXEC== в шапке и создает список из таких файлов      * +# файлы *.sh с ==AUTOEXEC== в шапке и создает список из таких файлов      * 
-с возможностью запуска                                                  * +# с возможностью запуска                                                  * 
- +# поддерживает режимы: включённые каталоги / исключённые каталоги        * 
-export LANG=en_US.UTF-8 +# можно задавать глубину вложенности и абсолютные/относительные пути     *
-export LC_ALL=en_US.UTF-8+
  
 INCLUDE_MARKER="# ==AUTOEXEC==" INCLUDE_MARKER="# ==AUTOEXEC=="
Строка 90: Строка 92:
 TMP_LIST="/tmp/script_launcher_list.txt" TMP_LIST="/tmp/script_launcher_list.txt"
 SELECTED_FILE="" SELECTED_FILE=""
 +
 +# Каталоги, которые нужно исключить (используются в режиме exclude)
 +EXCLUDE_DIRS=("scripts_arch" "backup_temp" "rpi_seal_arch")
 +
 +# Каталоги, которые нужно включить (используются в режиме include)
 +INCLUDE_DIRS=("scripts" "rpi_seal")
 +
 +# Глубина вложенности (0 = без ограничений)
 +MIN_DEPTH=0
 +MAX_DEPTH=0
 +
 +# Режим поиска: include — искать только в указанных каталогах,
 +#               exclude — искать везде, кроме исключённых
 +SEARCH_MODE="include"
  
 # --- Проверка fzf --- # --- Проверка fzf ---
Строка 100: Строка 116:
 > "$TMP_LIST" > "$TMP_LIST"
 SEPARATOR=" _                                                                                                                                _ " SEPARATOR=" _                                                                                                                                _ "
-find "$ROOT_DIR" -type f -name "*.sh" | sort | while read -r FILE; do+ 
 +FIND_CONDITION="" 
 +[[ "$MIN_DEPTH" -gt 0 ]] && FIND_CONDITION+=" -mindepth $MIN_DEPTH" 
 +[[ "$MAX_DEPTH" -gt 0 ]] && FIND_CONDITION+=" -maxdepth $MAX_DEPTH" 
 + 
 +if [[ "$SEARCH_MODE" == "include" ]]; then 
 +  for DIR in "${INCLUDE_DIRS[@]}"; do 
 +    [ -d "$DIR" ] || continue 
 +    find "$DIR" $FIND_CONDITION -type f -name "*.sh" 2>/dev/null 
 +  done 
 +else 
 +  EXCLUDE_EXPR="" 
 +  for DIR in "${EXCLUDE_DIRS[@]}"; do 
 +    ABS_DIR=$(realpath "$DIR"
 +    EXCLUDE_EXPR+=" -path \"$ABS_DIR\" -o" 
 +  done 
 +  EXCLUDE_EXPR="${EXCLUDE_EXPR::-3}" 
 +  eval "find \"$ROOT_DIR\\( $EXCLUDE_EXPR \) -prune -o $FIND_CONDITION -type f -name \"*.sh\" -print2>/dev/null 
 +fi | sort | while read -r FILE; do
   if grep -q "^$INCLUDE_MARKER" "$FILE"; then   if grep -q "^$INCLUDE_MARKER" "$FILE"; then
     TITLE=""     TITLE=""
     SHORT=""     SHORT=""
 +    found_title=false
     while IFS= read -r line; do     while IFS= read -r line; do
       [[ -z "$line" ]] && break       [[ -z "$line" ]] && break
Строка 109: Строка 144:
         CLEANED="${line#\# }"         CLEANED="${line#\# }"
         if [[ "$CLEANED" =~ ^===.*=== ]]; then         if [[ "$CLEANED" =~ ^===.*=== ]]; then
-          TITLE="$CLEANED"+          TITLE="$(echo "$CLEANED" | sed -E 's/^=== *(.*?) *===$/\1/')"
           found_title=true           found_title=true
         elif [[ "$found_title" = true && -z "$SHORT" ]]; then         elif [[ "$found_title" = true && -z "$SHORT" ]]; then
Строка 130: Строка 165:
  
 # --- Предпросмотр --- # --- Предпросмотр ---
-PREVIEW_CMD=$(cat <<EOF +PREVIEW_CMD=$(cat <<'EOF' 
-FILE=\$(echo {} | awk -F "$SEPARATOR" '{print \$2}'+FILE=$(echo {} | awk -F " _                                                                                                                                _ " '{print $2}'
-if [ -f "\$FILE" ]; then +if [ -f "$FILE" ]; then 
-  ENCODING=\$(file -bi "\$FILE" | cut -d= -f2) +  ENCODING=$(file -bi "$FILE" | cut -d= -f2) 
-  if [ "\$ENCODING" != "utf-8" ]; then +  if [ "$ENCODING" != "utf-8" ]; then 
-    echo "⚠️ Кодировка файла: \$ENCODING (not UTF-8)"+    echo "⚠️ Кодировка файла: $ENCODING (not UTF-8)"
     echo "Могут быть проблемы с отображением."     echo "Могут быть проблемы с отображением."
     echo ""     echo ""
   fi   fi
-  BASENAME=\$(basename "\$FILE"+  BASENAME=$(basename "$FILE"
-  TITLE_LINE=\$(awk '/^# ==AUTOEXEC==/{flag=1; next} /^$/{flag=0} flag && /^#/ && /===.*===/ { sub(/^# ?/, "", \$0); print; exit }' "\$FILE"+  TITLE_LINE=$(awk '/^# ==AUTOEXEC==/{flag=1; next} /^$/{flag=0} flag && /^#/ && /===.*===/ { sub(/^# ?=== */, "", $0); sub(/ *===$/, "", $0); print; exit }' "$FILE"
-  echo -e "📄 \$BASENAME\n📂 \$FILE\n\n📛 \$TITLE_LINE\n" +  echo -e "📄 $BASENAME\n📂 $FILE\n\n📛 $TITLE_LINE\n" 
-  awk '/^# ==AUTOEXEC==/{flag=1; next} /^$/{flag=0} flag && /^#/ && !/===.*===/ { sub(/^# ?(\\* )?/, "", \$0); print }' "\$FILE"+  awk '/^# ==AUTOEXEC==/{flag=1; next} /^$/{flag=0} flag && /^#/ && !/===.*===/ { sub(/^# ?(\* )?/, "", $0); print }' "$FILE"
 else else
-  echo "❌ Файл не найден: \$FILE"+  echo "❌ Файл не найден: $FILE"
 fi fi
 EOF EOF
Строка 152: Строка 187:
 while true; do while true; do
   echo "📦 Выберите режим запуска:"   echo "📦 Выберите режим запуска:"
-  echo " 1fzf-интерфейс $([ "$HAS_FZF" = true ] && echo "(доступен)" || echo "(недоступен)")" +  echo " 1 - 🚀fzf-интерфейс $([ "$HAS_FZF" = true ] && echo "(доступен)" || echo "(недоступен)")" 
-  echo " 2Классическое текстовое меню" +  echo " 2 - 📄Классическое текстовое меню" 
-  echo " 0Выход"+  echo " 0 - ❌Выход"
   echo -n ">> "   echo -n ">> "
   read -r launcher_mode   read -r launcher_mode
Строка 183: Строка 218:
       echo " 0) ❌ Выход"       echo " 0) ❌ Выход"
       echo       echo
-      mapfile -t ENTRIES < <(cut -d"$SEPARATOR" -f1 "$TMP_LIST")+      mapfile -t ENTRIES < <(awk -"$SEPARATOR" '{print $1}' "$TMP_LIST")
       ENTRIES+=("❌ Выход")       ENTRIES+=("❌ Выход")
  
Строка 224: Строка 259:
  
 rm -f "$TMP_LIST" rm -f "$TMP_LIST"
 +
 </code>++++ </code>++++
  
  
 ===== Описание ===== ===== Описание =====
-++++script_launcher|+++++script_launcher.md|
 <code md script_launcher.md> <code md script_launcher.md>
-Script Launcher+🚀 Лаунчер скриптов (версия V4)
  
-Утилита для запуска локальных скриптов с использованием системы тегов и интерфейса выбора. Поддерживает интерактивный выбор через `fzf` (если установлен) или текстовое меню. Разрабатывается для работы в рамках одного каталога, ориентирована на читаемость и безопасность.+**Дата создания:** 2025-04-05
  
----+## 📄 Описание
  
-## 📦 Возможности+Этот Bash-скрипт выполняет поиск и запуск `.sh`-файлов, содержащих маркер `# ==AUTOEXEC==` в шапке. Он поддерживает два режима поиска:
  
-Поиск всех `.sh`-файлов в текущем каталоге +`exclude` — поиск от корня, исключая определённые каталоги. 
-- Отбор скриптов только с маркером `# ==AUTOEXEC==` +- `include— поиск только в явно указанных каталогах.
-- Чтение заголовка (вида `# === Название ===`) и краткого описания (`# * краткое описание`) +
-Поддержка интерфейса выбора через `fzfс предпросмотром описания +
-- Альтернатива — классическое текстовое меню Bash +
-- Подтверждение перед запуском +
-- Поддержка временных файлов через `mktemp` с автоудалением (`trap`)+
  
----+## ⚙️ Переменные настройки
  
-## 🔧 Требования+| Переменная     | Назначение                                                                     | 
 +|----------------|--------------------------------------------------------------------------------| 
 +| `MODE`         | Режим поиска: `auto` / `manual` (в этом варианте используется `exclude`)       | 
 +| `ROOT_DIR`     | Корневая директория поиска в режиме `exclude`                                  | 
 +| `INCLUDE_DIRS` | Каталоги для поиска в режиме `include` (можно задать относительные/абсолютные) | 
 +| `EXCLUDE_DIRS` | Каталоги, исключаемые из поиска                                                | 
 +| `MIN_DEPTH`    | Минимальная глубина вложенности (0 — без ограничений)                          | 
 +| `MAX_DEPTH`    | Максимальная глубина вложенности (0 — без ограничений)                         | 
 +| `SEPARATOR`    | Разделитель между заголовком и путём в списке                                  | 
 +| `TMP_LIST`     | Временный файл для хранения списка найденных скриптов                          |
  
-- Bash 4+ +## 🧩 Логика
-- [fzf](https://github.com/junegunn/fzf) (опционально, для интерактивного режима)+
  
-Установка fzf: +1. Выполняется поиск `.sh`-файлов с учётом глубины и включений/исключений. 
-```bash +2. Извлекаются заголовок (`# === Название ===`) и краткое описание. 
-sudo apt update && sudo apt install -y fzf +3. Создаётся список скриптов, отображаемый через: 
-``+   - `fzf(при наличии), 
- +   или классическое Bash-меню. 
---- +4. Запуск выбранного скрипта с подтверждением.
- +
-## 🧠 Структура+
  
-Скрипты должны содержать специальную метку `# ==AUTOEXEC==`, за которой идут комментарии с описанием:+## 🔍 Пример использования
  
 +Просто запустить:
 ```bash ```bash
-# ==AUTOEXEC== +./launcher.sh
-# === Название скрипта === +
-# * Краткое описание или цель+
 ``` ```
  
-Пример+## 🗂 Пример структуры проекта
-```bash +
-# ==AUTOEXEC== +
-# === Сохранить резервную копию === +
-# * Создаёт .tar.gz архив с логированием +
-```+
  
---- 
- 
-## 🚀 Запуск 
- 
-Сначала выполните `launcher.sh` из нужного каталога: 
-```bash 
-bash launcher.sh 
 ``` ```
-- У меня настроен алиас на высов скрипта 'lll', мне кажется так удобнее +project/ 
- +├── launcher.sh 
- +├── scripts/ 
-Выберите интерфейс: +│   ├── backup.sh 
-1fzf-интерфейс (если доступен) +│   ├── update.sh 
-2. Классическое меню +├── scripts_arch/ 
-0Выход +│   └── old_backup.sh 
- +```
-Выбранный скрипт запускается **только после подтверждения**+
- +
---- +
- +
-## 🔐 Безопасность и устойчивость +
- +
-- Временные файлы создаются через `mktemp`, исключая конфликты при параллельном запуске +
-- Удаляются автоматически через `trap EXIT` +
-- Нет выполнения кода без согласия пользователя +
-- Нет внешних сетевых обращений +
- +
---- +
- +
-## 📁 Планы на будущее +
- +
-- Опциональная поддержка `.py`-файлов +
-- Флаги запуска (`--py``--no-preview` и т.п.) +
-- Категории или теги +
-- Логирование запусков+
  
----+## 🛡️ Советы
  
-Дата обновления: 26.03.2025+- Убедитесь, что скрипты имеют маркер `# ==AUTOEXEC==` и заголовок `# === Название ===`. 
 +- Скрипт работает стабильно с абсолютными и относительными путями. 
 +- Для предпросмотра `fzf` необходим пакет `fzf`.
  
  
 </code> </code>
 ++++ ++++
 +----
 +{{page>common:footer&noeditbutton}}
niceos/script_launcher_bh.1743280085.txt.gz · Последнее изменение:

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