Привет, Хабр! Часто ли Вы сталкиваетесь с необходимостью искать в закладках/заметках "ту самую" важную, но редко необходимую команду? git log, который Вы не использовали полгода или спасительный docker compose с десятком флагов. Нередко подобный поиск превращается в пятиминутный квест.

В статье напишем функцию cheat, которая дополнит терминал личной "базой знаний" с Вашим личным перечнем команд. Вводим cheat docker - получаем проверенный список команд мгновенно, без поиска в браузере и чтения мануалов.

Введение

Думаю, у многих в арсенале есть свой набор команд, которые не помещаются в голове, редко используются (в последствии забываются). git, docker, спасительные команды - всё это часто копится в виде закладок в браузере, хаотичных файлов и прочих способов сохранения информации.

Постоянно гуглить или лезть в файл - неэффективно, отвлекает, создаёт лишние действия. Есть готовые утилиты вроде cheat.sh, но они не помогут, когда необходимо записать свою уникальную команду.

В этой статье разберу bash-функцию cheat. Она может:

  1. Хранить личные шпаргалки в текстовом файле.

  2. Мгновенно показывать их по ключевому слову.

К концу статьи у нас будет работающая команда cheat, которую можно расширять под свои нужды. К примеру, вызов cheat docker покажет личный список важных docker-команд.

1. Создание функции

Bash-функции, которые должны быть доступны всегда, принято прописывать в файле ~/.bashrc (для bash) или ~/.zshrc (для zsh). При старте терминала этот файл автоматически выполняется.

Откроем в редакторе. Я буду использовать nano, Вы можете выбрать свой:

nano ~/.bashrc

Если Вы используете Zsh, замените ~/.bashrc на ~/.zshrc

Почему в ~/.bashrc? Это надёжнее, чем создание отдельного исполняемого файла. Функция будет частью сессии и доступа в любом каталоге.

Прокрутите файл до самого конца и добавьте следующий код. Я подробно прокомментирую каждую строчку.

# Персональная система шпаргалок (cheat sheets)
cheat() {
    # Путь к файлу, где будут храниться шпаргалки
    local CHEAT_FILE=~/.cheatsheet

    # Если файла еще нет, создаем его
    if [[ ! -f "$CHEAT_FILE" ]]; then
        touch "$CHEAT_FILE"
        echo "Файл для шпаргалок создан: $CHEAT_FILE"
    fi

    # Если функция вызвана без аргументов - показываем весь файл
    if [[ $# -eq 0 ]]; then
        cat "$CHEAT_FILE"
        return
    fi

    # Ищем ключевое слово в файле и выводим найденный блок
    awk -v keyword="$1" '
        $0 ~ "^- " keyword " -$" { found=1; print; next }
        found && /^- [a-zA-Z0-9]+ -$/ { found=0 }
        found { print }
    ' "$CHEAT_FILE"
}

Распишу подробнее, что к чему:

  • local CHEAT_FILE=~/.cheatsheet - мы объявляем переменную с путем к нашему файлу-хранилищу.

  • Проверка if [[ ! -f "$CHEAT_FILE" ]] и команда touch создают файл при первом запуске, чтобы избежать ошибки.

  • Проверка if [[ $# -eq 0 ]] срабатывает, если мы вызвали cheat без аргументов. В этом случае просто показывается всё содержимое файла.

  • Поиск по ключевом слову происходит в awk. Разберём логику:

    1. -v keyword="$1" - передаем в awk первый аргумент функции (например, docker) как переменную keyword.

    2. $0 ~ "^- " keyword " -$" { found=1; print; next } - если строка соответствует шаблону - docker - (где docker - наш ключ), мы устанавливаем флаг found=1, печатаем эту строку-заголовок и переходим к следующей строке (next).

    3. found && /^- [a-zA-Z0-9]+ -$/ { found=0 } - если флаг found установлен и мы встречаем новую строку-заголовок (например, - git -), это значит, что блок с нашими командами закончился. Сбрасываем флаг found=0.

    4. found { print } - пока флаг found поднят, печатаем все строки. Это и есть наши команды внутри блока.

Функция добавлена в файл, но текущая сессия терминала об этом "не знает". Нужно перезагрузить. Делается это одной командой:

source ~/.bashrc

Или source ~/.zshrc, если вы используете Zsh

2. Наполняем "базу знаний"

Тут всё просто, приступаем к созданию самих шпаргалок. Я буду просто добавлять их в текстовый файл ~/.cheatsheet.

Откроем файл для редактирования:

nano ~/.cheatsheet

И добавим, к примеру, следующие блоки:

- docker -
# Остановить и удалить все контейнеры
docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
# Показать логи запущенного контейнера
docker logs -f 
# Удалить все неиспользуемые образы, контейнеры, volumes и сети
docker system prune -a --volumes

- git -
# Красивый граф коммитов в одну строку
git log --oneline --graph --all
# Восстановить удаленный файл из последнего коммита
git checkout HEAD -- 
# Переименовать последний коммит
git commit --amend

- ffmpeg -
# Конвертировать видео в MP4 (H.264)
ffmpeg -i input.mov -vcodec h264 -acodec aac output.mp4
# Извлечь аудиодорожку из видео
ffmpeg -i input.mp4 -vn -acodec copy output.aac

Очень важно соблюдать строгий формат (дабы не ломать логику awk): каждая тема должна начинаться со строки - ключевое_слово -. Команды и комментарии пишутся до следующего заголовка.

Результат и проверка

В целом, мы закончили. Можно протестировать:

Шпаргалка по docker:

cheat docker
Вывод cheat docker
Вывод cheat docker

Шпаргалка по git:

cheat git
Вывод chea git
Вывод chea git

Запуск без аргументов:

cheat
Вывод cheat. Покажет весь список из файла
Вывод cheat. Покажет весь список из файла

Заключение

За несколько минут была создана достаточно полезная система для хранения шпаргалок в терминале. Никаких дополнительных пакетов не требуется, список команд легко редактируется.

Ещё варианты ~/.cheatsheet

Дополнительно, хотелось бы привести разные примеры "шпаргалок", возможно кому-то будет полезно. Анализ сети и процессов:

- network -
# Показать все открытые сетевые соединения и процессы
ss -tulpn
# Найти процесс, занимающий конкретный порт
lsof -i :8080
# Мониторинг сетевых интерфейсов в реальном времени
iftop
# Постоянный пинг с временной меткой
ping -D 8.8.8.8
# Трассировка маршрута с AS номерами
mtr --aslookup google.com

- debug -
# Поиск по запущенным процессам
ps aux | grep -i nginx
# Показать открытые файлы процесса
lsof -p <PID>
# Мониторинг использования диска в реальном времени
iotop
# Статистика использования памяти процессами
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -20
# Детальная информация о процессе
cat /proc/<PID>/status

- ports -
# Какие порты слушаются
netstat -tulpn | grep LISTEN
# Проверить доступность порта удаленно
nc -zv example.com 80
# Сканирование открытых портов на localhost
nmap -sT -O localhost
# Какие порты открыты наружу
ss -tulpn | grep -E ':(80|443|22|53)'

Для повседневной работы:

- git-advanced -
# Отменить последний коммит, сохраняя изменения в рабочей директории
git reset --soft HEAD~1
# Временно спрятать изменения и вернуться к чистому состоянию
git stash
# Вернуть спрятанные изменения
git stash pop
# Просмотреть историю коммитов с изменениями за последнюю неделю
git log --since="1 week ago" --oneline --graph
# Безопасно переписать историю последних 3 коммитов
git rebase -i HEAD~3

- docker-cleanup -
# Удалить все остановленные контейнеры
docker container prune -f
# Удалить все неиспользуемые образы
docker image prune -a
# Очистить всё: контейнеры, образы, сети, билд-кэш
docker system prune -a --volumes
# Показать детальное использование диска Docker
docker system df

- system-info -
# Показать информацию о дисковом пространстве в человекочитаемом формате
df -h
# Детальная информация об использовании памяти
free -h
# Температура компонентов системы
sensors
# Информация о процессе в реальном времени
htop
# Показать загрузку CPU по ядрам
mpstat -P ALL

- text-processing -
# Поиск рекурсивно по файлам с подсветкой
grep -r "pattern" . --color=auto
# Замена текста в нескольких файлах
find . -name "*.txt" -exec sed -i 's/old/new/g' {} \;
# Подсчет строк в проекте
find . -name "*.py" | xargs wc -l
# Показать первые 10 самых частых слов в файле
cat file.txt | tr ' ' '\n' | sort | uniq -c | sort -nr | head -10

- ssh-keys -
# Сгенерировать новый SSH ключ
ssh-keygen -t ed25519 -C "your_email@example.com"
# Скопировать SSH ключ на сервер
ssh-copy-id user@hostname
# Проверить подключение к SSH без пароля
ssh -o PreferredAuthentications=publickey user@hostname
# Показать fingerprint ключа
ssh-keygen -lf ~/.ssh/id_ed25519

P. S. В моей группе в Телеграмм разбираем практические кейсы: скрипты (Python/Bash/PowerShell), тонкости ОС и инструменты для эффективной работы.

Комментарии (22)


  1. Dominatos
    14.10.2025 14:08

    https://github.com/dominatos/devtoolbox-cheats

    вот ещё вариант, если кому нужно. Та же идёт уже с более чем 80 различных шпаргалок


  1. wwq_deezer
    14.10.2025 14:08

    А теперь нужна шпаргалка по ключевым словам. :(


  1. Verda_Stelo
    14.10.2025 14:08

    Спасибо! Давно искал что-то простое и понятное.


  1. drnorfolk
    14.10.2025 14:08

    Идея классная и простая в исполнении! Интересно, а может в oh-my-zsh уже есть такой плагин? Никто не встречал?


  1. Tony-Sol
    14.10.2025 14:08

    Идея отличная. Реализация на bash выглядит как mvp, суда прям напрашивается четкая структура файла и полноценная утилита (на go/rust).

    Файл может json/yaml, проще парсить, но сложнее редактировать руками или наоборот - md. Если будет md, это можно будет легко интегрировать в obsidian, так получится что в хранилище имеем шпаргалку, там ее правим/читаем/шарим, а в консоли через конфиг или переменную окружения подсовываем в cheat.

    А если прям совсем угареть, можно синтегрироваться с fzf и zle (к сожалению не знаю альтернативы для bash) и искать нечетким поиском, а на выходе получить шаблон строки, где курсор уже в нужной позиции будет.


    1. eternaladm Автор
      14.10.2025 14:08

      С .md интересная реализация, надо будет подумать. Спасибо!


  1. litos
    14.10.2025 14:08

    А еще бы интеграцию терминала с нейросетью сделать...


    1. n0isy
      14.10.2025 14:08

      эээ. Привет из 2025. (начните с Codex, Claude Code, Gemini CLI)


    1. navion
      14.10.2025 14:08

      Такой называется RHEL Lightspeed.


  1. fraks
    14.10.2025 14:08

    С одной стороны - просто и достаточно удобно. С другой - переизобретаем уже изобретенное.

    Для чего делать один файл с секциями если можно на каждую секцию сделать по файлу, и не копать общий файл через awk. Бонусом имеем просмотр всех тем-ключевых слов просто в виде имен файлов, и файловая система будет сама следить за их уникальностью. в одном файле следить за уникальностью секций придется самостоятельно, и в большом файле может быть неудобно.

    По большому счету - это переизобретение классического man который есть в любой системе. Добавляем в конфиг мана свою папку, что бы свои читы не класть в системные папки, и все работает. Правда писать странички на языке разметки манов не очень удобно.

    Именовать файлы можно с расширением .md и писать с применением разметки. Тот же nano при редактировании .md-файлов автоматом подсвечивает разметку. Даже без исполнения этой разметки, только с подсвечиванием - это уже удобнее. Вывести тест в консоль с подсветкий синтаксиса можно программкой bat (примерно как cat только умеет подсвечивать множество синтаксисов).

    Если ключевых слов наберется много, можно написать скриптик с применением fzf который покажет этот список, зафильтрует, даст выбрать один из (или не один) и даже можно сделать показ превью, через тот же bat с подсветкой синтаксиса.

    Можно сделать много файлов с уточнением ключей, что бы итоговые файлы получались небольшие. Что бы среди них выбрать - запускаем их список через fzf, набирая буквы быстро фильтруем большой список, уточняя его до потребного состояния, из оставшегося выбираем нужное, выводим на экран. Кстати, через fzf можно не только выбрать, но и передать в командную строку не выполняя, потом подставляем руками нужный аргумент или редактируем - и готово.


    1. eternaladm Автор
      14.10.2025 14:08

      Для чего делать один файл с секциями если можно на каждую секцию сделать по файлу, и не копать общий файл через awk

      Потому что создавать отдельный файл под одну команду в секции - долго. Да и зачем городить из обычной «шпаргалки» целую базу знаний. Под них действительно хватает качественных решений.

      По большому счету - это переизобретение классического man который есть в любой системе. 

      Ни в коем случае, man не даст мне настолько просто добавить личную команду с нужными флагами.

      Именовать файлы можно с расширением .md и писать с применением разметки. Тот же nano при редактировании .md-файлов автоматом подсвечивает разметку. 

      Согласен, тут полностью с Вами согласен, выше уже писали об этом. Со стороны .md на этот вопрос я не смотрел. Для себя искал быстрое и простое решение, а-ля минимализм.

      Если ключевых слов наберется много, можно написать скриптик с применением fzf 

      Согласен, но это уже на утилиту смахивает, нежели на быстрое «решить здесь и сейчас, да еще и так, чтоб надолго хватило». Мой .cheatsheet состоит буквально из 10 команд, не хочется ради такого количества запариваться.

      Подытоживая, свои потребности я закрыл целиком и полностью.


      1. winorun
        14.10.2025 14:08

        echo "git --log --oneline --graph --all #@brief Красивый лог" >> ~/.local/info/git

        Самый минимализм

        Запускаем

        info --directory ~/.local/info/git git


  1. winorun
    14.10.2025 14:08

    1) делаем длинную историю

    2) при выполнении редких команд в конец добавляем комментарий, например

    git --log --oneline --graph --all #@brief Красивый лог

    3) делаем grep по history


    1. 0x131315
      14.10.2025 14:08

      В oh-my-zsh удобный поиск по истории - по ctrl+r, по подстроке. Вываливается сразу десяток вариантов, остается стрелками выбрать нужный. Только не помню из коробки это или через один из history-плагинов.


  1. Reide740
    14.10.2025 14:08

    Есть уже подобный инструмент, в котором руками сообщества написаны шпаргалки по готовым man'ам: https://tldr.sh/

    https://github.com/tldr-pages/tldr


  1. diderevyagin
    14.10.2025 14:08

    Очень толковая идея, спасибо !


  1. pda0
    14.10.2025 14:08

    Говорят для этого даже специальная программа была, man называется. :) Но штатные man слишком подробные. Надо будет на досуге обдумать эту идею, сделать автоматическое построение man файлов по .md...


    1. DVoropaev
      14.10.2025 14:08

      искал комментарий вида:

      зумеры изобрели man

      ну а если серьезно, идея прикольная. я бы еще git привязал (чтобы на нескольких рабочих станциях синхронизировать или делиться с кем либо)


      1. pda0
        14.10.2025 14:08

        Ну да, у man уже есть форматирование. А так вообще win-win ситуация получается. Кому надо - кладёт в git, кому надо - папка в Obsidian. И тут же локально превращается в файлы man...


  1. hazard2005
    14.10.2025 14:08

    Я такое делал через make


  1. ollo71
    14.10.2025 14:08

    при вызове без аргументов, имхо, удобнее так:

    cat "$CHEAT_FILE" | grep "^- "

    т.е. ключевые слова


  1. quarus
    14.10.2025 14:08

    Использую https://github.com/cheat/cheat

    Утилита существует во многих пакетах.