Это старая версия документа!
Script Launcher
Linux

Скрипты далее перебирают все скрипты *.sh в каталоге запуска и подкаталогах, если имеет доступ
и отбирают те в которых есть # ==AUTOEXEC==
#!/bin/bash
# ==AUTOEXEC==
# === Название программы ===
# Строка для основного описания
# Строки для развернутого описания
# Строки для развернутого описания
#
строка для основного описания будет отображена следом за названием скрипта *.sh через *
признаком окончания описания является первая первая найденная строка где кроме # ничего нет
Шаблон скрипта
Шаблон оформления скрипта для применения в лаунчере
Дополнительно сделан шаблон меню с выбором пунктов
Шаблон файла с заголовками для использования в лаунчере (нажмите чтобы раскрыть)
- 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
Лаунчер
Лаунчер
- launcher.sh
#!/bin/bash
# Устанавливаем локаль, чтобы fzf и вывод работали корректно
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
# === 🚀Лаунчер ===
# * ищет в основном каталоге и подкаталогах *
# * файлы *.sh с ==AUTOEXEC== в шапке и создает список из таких файлов *
# * с возможностью запуска *
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) ---
> "$TMP_LIST"
SEPARATOR=" _ _ "
find "$ROOT_DIR" -type f -name "*.sh" | sort | 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"
found_title=true
elif [[ "$found_title" = true && -z "$SHORT" ]]; then
SHORT="$CLEANED"
fi
fi
done < <(tail -n +2 <(grep -A30 "^$INCLUDE_MARKER" "$FILE"))
TITLE=${TITLE:-"(Без названия)"}
DISPLAY_LINE="$TITLE"
[ -n "$SHORT" ] && DISPLAY_LINE+=" * $SHORT"
echo "$DISPLAY_LINE$SEPARATOR$FILE" >> "$TMP_LIST"
fi
done
if [ ! -s "$TMP_LIST" ]; then
echo "❌ Не найдено подходящих скриптов."
exit 1
fi
# --- Предпросмотр ---
PREVIEW_CMD=$(cat <<EOF
FILE=\$(echo {} | awk -F "$SEPARATOR" '{print \$2}')
if [ -f "\$FILE" ]; then
ENCODING=\$(file -bi "\$FILE" | cut -d= -f2)
if [ "\$ENCODING" != "utf-8" ]; then
echo "⚠️ Кодировка файла: \$ENCODING (not UTF-8)"
echo "Могут быть проблемы с отображением."
echo ""
fi
BASENAME=\$(basename "\$FILE")
TITLE_LINE=\$(awk '/^# ==AUTOEXEC==/{flag=1; next} /^$/{flag=0} flag && /^#/ && /===.*===/ { sub(/^# ?/, "", \$0); print; exit }' "\$FILE")
echo -e "📄 \$BASENAME\n📂 \$FILE\n\n📛 \$TITLE_LINE\n"
awk '/^# ==AUTOEXEC==/{flag=1; next} /^$/{flag=0} flag && /^#/ && !/===.*===/ { sub(/^# ?(\\* )?/, "", \$0); print }' "\$FILE"
else
echo "❌ Файл не найден: \$FILE"
fi
EOF
)
# --- Выбор интерфейса запуска ---
while true; do
echo "📦 Выберите режим запуска:"
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=$(fzf --prompt="🚀 Выберите скрипт: " \
--delimiter="$SEPARATOR" \
--preview="$PREVIEW_CMD" \
--preview-window=right:60%:wrap \
< "$TMP_LIST")
if [ -z "$SELECTED_LINE" ]; then
echo "❎ Отмена пользователем."
rm -f "$TMP_LIST"
exit 0
fi
SELECTED_FILE=$(echo "$SELECTED_LINE" | awk -F "$SEPARATOR" '{print $2}' | xargs)
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"$SEPARATOR" -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 | awk -F "$SEPARATOR" '{print $2}' | xargs)
break 2
done
;;
0)
echo "👋 До свидания!"
rm -f "$TMP_LIST"
exit 0
;;
*)
echo "❌ Неверный выбор"
;;
esac
done
# --- Подтверждение и запуск ---
echo "⚠️ Скрипт: $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"
Описание
script_launcher
- script_launcher.md
# 📄 script_launcher.sh — Умный лаунчер Bash/Python-скриптов
## 📌 Описание
Лаунчер ищет во всех подкаталогах текущего каталога скрипты `.sh`, содержащие специальную метку `# ==AUTOEXEC==` в шапке, и формирует список таких скриптов для удобного запуска.
Он поддерживает два режима запуска:
- Через **fzf** (если установлен);
- Через **текстовое меню**, если `fzf` недоступен.
Для каждого скрипта показывается краткое описание и путь, доступен предпросмотр заголовков и комментариев.
---
## 🔧 Поддерживаемые расширения:
- `.sh` — Bash
---
## 📁 Формат шапки в скрипте:
\`\`\`bash
# ==AUTOEXEC==
# === Название ===
# Краткое описание
# * Подробности (опционально)
\`\`\`
---
## 📌 Использование
\`\`\`bash
bash script_launcher.sh
\`\`\`
---
## 💬 Зависимости
- `bash`
- `grep`, `awk`, `tail`
- `fzf` (опционально для расширенного интерфейса)
---
## 💡 Особенности:
- Автоматический предпросмотр содержимого
- Проверка кодировки файлов (с предупреждением)
- Эмоджи и визуальное оформление
- Автоудаление временного файла
- Поддержка Bash-скриптов
Одобрить материально
Поддержать через Boosty