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

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


niceos:script_launcher_bh

Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
niceos:script_launcher_bh [2025/03/29 23:36] – [Лаунчер] 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
 # === 🚀Лаунчер === # === 🚀Лаунчер ===
-ищет в основном каталоге и подкаталогах                                 * +# ищет в основном каталоге и подкаталогах                                 * 
-файлы *.sh с ==AUTOEXEC== в шапке и создает список из таких файлов      * +# файлы *.sh с ==AUTOEXEC== в шапке и создает список из таких файлов      * 
-с возможностью запуска                                                  * +# с возможностью запуска                                                  * 
- +# поддерживает режимы: включённые каталоги / исключённые каталоги        * 
-export LANG=en_US.UTF-8 +# можно задавать глубину вложенности и абсолютные/относительные пути     *
-export LC_ALL=en_US.UTF-8+
  
 INCLUDE_MARKER="# ==AUTOEXEC==" INCLUDE_MARKER="# ==AUTOEXEC=="
Строка 88: Строка 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 ---
Строка 98: Строка 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
Строка 107: Строка 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
Строка 128: Строка 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
Строка 150: Строка 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
Строка 181: Строка 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+=("❌ Выход")
  
Строка 222: Строка 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.sh — Умный лаунчер Bash/Python-скриптов+🚀 Лаунчер скриптов (версия V4)
  
-## 📌 Описание +**Дата создания:** 2025-04-05
-Лаунчер ищет во всех подкаталогах текущего каталога скрипты `.sh`, содержащие специальную метку `# ==AUTOEXEC==` в шапке, и формирует список таких скриптов для удобного запуска.+
  
-Он поддерживает два режима запуска: +## 📄 Описание
-- Через **fzf** (если установлен); +
-- Через **текстовое меню**, если `fzf` недоступен.+
  
-Для каждого скрипта показывается краткое описание и путь, доступен предпросмотр заголовков и комментариев.+Этот Bash-скрипт выполняет поиск и запуск `.sh`-файлов, содержащих маркер `# ==AUTOEXEC==` в шапке. Он поддерживает два режима поиска:
  
----+`exclude` — поиск от корня, исключая определённые каталоги. 
 +`include` — поиск только в явно указанных каталогах.
  
-## 🔧 Поддерживаемые расширения: +## ⚙️ Переменные настройки
-- `.sh` — Bash+
  
----+| Переменная     | Назначение                                                                     | 
 +|----------------|--------------------------------------------------------------------------------| 
 +| `MODE`         | Режим поиска: `auto` / `manual` (в этом варианте используется `exclude`)       | 
 +| `ROOT_DIR`     | Корневая директория поиска в режиме `exclude`                                  | 
 +| `INCLUDE_DIRS` | Каталоги для поиска в режиме `include` (можно задать относительные/абсолютные) | 
 +| `EXCLUDE_DIRS` | Каталоги, исключаемые из поиска                                                | 
 +| `MIN_DEPTH`    | Минимальная глубина вложенности (0 — без ограничений)                          | 
 +| `MAX_DEPTH`    | Максимальная глубина вложенности (0 — без ограничений)                         | 
 +| `SEPARATOR`    | Разделитель между заголовком и путём в списке                                  | 
 +| `TMP_LIST`     | Временный файл для хранения списка найденных скриптов                          |
  
-## 📁 Формат шапки в скрипте: +## 🧩 Логика
-\`\`\`bash +
-# ==AUTOEXEC== +
-# === Название === +
-# Краткое описание +
-# * Подробности (опционально) +
-\`\`\`+
  
----+1. Выполняется поиск `.sh`-файлов с учётом глубины и включений/исключений. 
 +2. Извлекаются заголовок (`# === Название ===`) и краткое описание. 
 +3. Создаётся список скриптов, отображаемый через: 
 +   `fzf` (при наличии), 
 +   или классическое Bash-меню. 
 +4. Запуск выбранного скрипта с подтверждением.
  
-## 📌 Использование +## 🔍 Пример использования
-\`\`\`bash +
-bash script_launcher.sh +
-\`\`\`+
  
----+Просто запустить: 
 +```bash 
 +./launcher.sh 
 +```
  
-## 💬 Зависимости +## 🗂 Пример структуры проекта
-- `bash` +
-- `grep`, `awk`, `tail` +
-- `fzf` (опционально для расширенного интерфейса)+
  
----+``` 
 +project/ 
 +├── launcher.sh 
 +├── scripts/ 
 +│   ├── backup.sh 
 +│   ├── update.sh 
 +├── scripts_arch/ 
 +│   └── old_backup.sh 
 +``` 
 + 
 +## 🛡️ Советы 
 + 
 +Убедитесь, что скрипты имеют маркер `# ==AUTOEXEC==` и заголовок `# === Название ===`. 
 +Скрипт работает стабильно с абсолютными и относительными путями. 
 +Для предпросмотра `fzf` необходим пакет `fzf`.
  
-## 💡 Особенности: 
-- Автоматический предпросмотр содержимого 
-- Проверка кодировки файлов (с предупреждением) 
-- Эмоджи и визуальное оформление 
-- Автоудаление временного файла 
-- Поддержка Bash-скриптов 
  
 </code> </code>
 ++++ ++++
- 
 ---- ----
-**Одобрить материально** +{{page>common:footer&noeditbutton}}
-[[https://boosty.to/takraztak/donate|Поддержать через Boosty]]+
niceos/script_launcher_bh.1743280609.txt.gz · Последнее изменение:

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