TGViewer
BashTex | Linux BashTex | Linux @bash_tex · 2.51K subscribers
Post #312 1.3K
Построение интерактивного CLI-меню с автодополнением и подсказками

Хотите, чтобы ваши скрипты ощущались как полноценные CLI-утилиты? Добавим в них: интерактивное меню, автодополнение (TAB) и встроенные описания/подсказки по командам.

Создадим скрипт с поддержкой команд (подкоманд) и аргументов, а затем подключаем к нему bash completion через complete -F.

▪️ Пример CLI с командами и подсказками


#!/usr/bin/env bash

# --- CLI-команды ---
main() {
local cmd="$1"; shift
case "$cmd" in
start) echo "Запуск сервиса" ;;
stop) echo "Остановка сервиса" ;;
status) echo "Статус сервиса" ;;
help|"") show_help ;;
*) echo "Неизвестная команда: $cmd"; show_help ;;
esac
}

# --- Подсказки ---
show_help() {
cat <<EOF
Доступные команды:
start - Запустить сервис
stop - Остановить сервис
status - Показать статус
help - Показать справку
EOF
}

main "$@"


▪️ Автодополнение через complete -F. Создаем функцию для автодополнения:


_cli_autocomplete() {
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
opts="start stop status help"

COMPREPLY=( $(compgen -W "${opts}" -- "$cur") )
return 0
}

# Подключаем к нашему скрипту
complete -F _cli_autocomplete mycli


Положите этот код в .bashrc или .bash_completion.d/mycli, и автодополнение команд заработает:


$ ./mycli <TAB>
start status stop help


▪️ Описание команд при наведении. Если используете bash-completion, можно интегрировать подсказки в стиле:


complete -o nospace -o default -F _cli_autocomplete mycli


В более продвинутых реализациях можно добавить справку по каждой команде - через compopt, __ltrim_colon_completions, compgen и массив COMPREPLY.

▪️ Рекомендованная структура CLI


mycli
├── bin/
│ ├── start
│ ├── stop
│ ├── status
└── mycli


Такой подход с автозагрузкой команд из bin/ позволяет расширять CLI без изменения основного скрипта.

BashTex 📱 #bash #utils
  • 👍 12
More from @bash_tex
  1. Oct 9, 2026BashTex 📱 #мем
  2. Oct 8, 2026Bridge FDB - как Linux bridge узнаёт, где находится MAC Linux bridge не знает заранее, за…
  3. Oct 7, 2026/dev/tcp - сетевое соединение средствами Bash В Bash есть малоизвестная возможность работа…
  4. Oct 6, 2026Ephemeral ports - почему заканчиваются исходящие TCP-порты Когда приложение устанавливает…
  5. Oct 5, 2026name_to_handle_at() - как получить файловый объект без обычного пути В Linux обычно обраща…
  6. Oct 2, 2026madvise() - как процесс подсказывает ядру, как он собирается использовать память Когда про…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →