Это старая версия документа!
Проекты
Linux
Скрипты далее перебирают все скрипты *.sh
в каталоге запуска и подкаталогах, если имеет доступ
и отбирают те в которых есть # ==AUTOEXEC==
#!/bin/bash
# ==AUTOEXEC==
# === Название программы ===
# * Строка для основного описания
# * Строки для развернутого описания
# * Строки для развернутого описания
#
признаком окончания описания является первая строка в которой после #
пустая строка
Лаунчер скриптов (средствами bash)
Скрипт для поиска и запуска скрптов из подкаталогов при помощи утилиты bash (нажмите чтобы раскрыть)
- launcher.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_list.txt"
# --- Поиск подходящих скриптов ---
> "$TMP_LIST"
find "$ROOT_DIR" -type f -name "*.sh" | while read -r FILE; do
if grep -q "^$INCLUDE_MARKER" "$FILE"; then
TITLE_TEXT=""
SHORT_TEXT=""
while IFS= read -r line; do
[[ -z "$line" ]] && break
if [[ "$line" =~ ^# ]]; then
CLEANED_LINE="${line#\# }"
if [[ "$CLEANED_LINE" =~ ^===.*=== ]]; then
TITLE_TEXT="$CLEANED_LINE"
elif [[ "$CLEANED_LINE" =~ ^\* ]]; then
SHORT_TEXT="${CLEANED_LINE#\* }"
break
fi
fi
done < <(tail -n +2 <(grep -A30 "^$INCLUDE_MARKER" "$FILE"))
if [ -n "$TITLE_TEXT" ] && [ -n "$SHORT_TEXT" ]; then
SHORT_DESC="\e[35m$TITLE_TEXT\e[0m * $SHORT_TEXT"
else
SHORT_DESC="$SHORT_TEXT"
fi
echo -e "$FILE|$SHORT_DESC" >> "$TMP_LIST"
fi
done
if [ ! -s "$TMP_LIST" ]; then
echo "❌ Подходящих скриптов не найдено. Убедитесь, что в них есть строка '$INCLUDE_MARKER' в начале."
exit 1
fi
# --- Отображение меню ---
PS3="📌 Выберите скрипт: "
echo "📜 Найденные скрипты:"
echo " 0) ❌ Выход"
echo
mapfile -t ENTRIES < <(cut -d'|' -f2 "$TMP_LIST")
ENTRIES+=("❌ Выход")
select ENTRY in "${ENTRIES[@]}"; do
if [[ "$REPLY" == "0" || "$ENTRY" == "❌ Выход" ]]; then
echo "👋 До свидания!"; rm -f "$TMP_LIST"; exit 0
fi
[ -z "$ENTRY" ] && echo "❌ Неверный выбор" && continue
SELECTED=$(grep -F "|$ENTRY" "$TMP_LIST" | head -n1 | cut -d'|' -f1)
break
done
# --- Показ подробного описания ---
echo
echo "📂 Скрипт: $SELECTED"
echo "🔍 Подробное описание:"
DESC=()
TITLE=""
while IFS= read -r line; do
[[ -z "$line" ]] && break
if [[ "$line" =~ ^# ]]; then
CLEANED_LINE="${line#\# }"
if [[ "$CLEANED_LINE" =~ ^== ]]; then
TITLE="$CLEANED_LINE"
else
DESC+=("$CLEANED_LINE")
fi
else
break
fi
done < <(grep -A20 "^$INCLUDE_MARKER" "$SELECTED" | tail -n +2)
if [ -n "$TITLE" ]; then
echo -e "\e[35m$TITLE\e[0m" # маджента
fi
for line in "${DESC[@]}"; do
echo "$line"
done
echo
# --- Выбор действия ---
PS3=" Выберите действие: "
echo " 0) ❌ Выход"
select ACTION in "⬅️ Назад" "🚀 Выполнить" "❌ Выход"; do
if [[ "$REPLY" == "0" ]]; then
echo "👋 До свидания!"; rm -f "$TMP_LIST"; exit 0
fi
case $REPLY in
1) echo "↩️ Возврат в меню"; exec "$0";;
2)
echo "⚠️ Подтвердите запуск '$SELECTED' (y/N):"
read confirm
if [[ "$confirm" =~ ^[Yy]$ ]]; then
echo "🚀 Запуск..."
bash "$SELECTED"
else
echo "❎ Отмена."
fi
break;;
3) echo "👋 До свидания!"; rm -f "$TMP_LIST"; exit 0;;
*) echo "❌ Неверный выбор";;
esac
done
Более наглядный интерфейс через скрипт далее
требуется установка fzf (предложит установить при запуске если еще не установлен)
Если откажетесь при установке, то попробует запустить Лаунчер скриптов (средствами bash)
Лаунчер скриптов (fzf)
Скрипт для поиска и запуска скрптов из подкаталогов при помощи утилиты fzf (нажмите чтобы раскрыть)
- launcher_fzf.sh
#!/bin/bash
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
# Проверка наличия fzf
if ! command -v fzf &>/dev/null; then
echo "📦 Утилита fzf не найдена. Установить её сейчас? (y/N):"
read -r confirm
if [[ "$confirm" =~ ^[Yy]$ ]]; then
sudo apt update && sudo apt install -y fzf
else
echo "⚠️ fzf не установлен. Переход в классическое меню..."
bash ./launcher.sh
exit 0
fi
fi
# Конфигурация
INCLUDE_MARKER="# ==AUTOEXEC=="
ROOT_DIR="$(pwd)"
TMP_LIST="/tmp/fzf_script_list.txt"
> "$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
# Выбор через 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)
# Запуск с подтверждением
echo "⚠️ Выбран скрипт: $(echo "$SELECTED_LINE" | cut -d'|' -f1)"
echo "📂 Файл: $SELECTED_FILE"
echo "Запустить его? (y/N):"
read -r confirm
if [[ "$confirm" =~ ^[Yy]$ ]]; then
echo "🚀 Запуск..."
bash "$SELECTED_FILE"
else
echo "❎ Отмена."
fi
rm -f "$TMP_LIST"