Хотите, чтобы ваши скрипты ощущались как полноценные 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