Привет, Хабр! Часто ли Вы сталкиваетесь с необходимостью искать в закладках/заметках "ту самую" важную, но редко необходимую команду? git log, который Вы не использовали полгода или спасительный docker compose с десятком флагов. Нередко подобный поиск превращается в пятиминутный квест.
В статье напишем функцию cheat, которая дополнит терминал личной "базой знаний" с Вашим личным перечнем команд. Вводим cheat docker - получаем проверенный список команд мгновенно, без поиска в браузере и чтения мануалов.
Введение
Думаю, у многих в арсенале есть свой набор команд, которые не помещаются в голове, редко используются (в последствии забываются). git, docker, спасительные команды - всё это часто копится в виде закладок в браузере, хаотичных файлов и прочих способов сохранения информации.
Постоянно гуглить или лезть в файл - неэффективно, отвлекает, создаёт лишние действия. Есть готовые утилиты вроде cheat.sh, но они не помогут, когда необходимо записать свою уникальную команду.
В этой статье разберу bash-функцию cheat. Она может:
Хранить личные шпаргалки в текстовом файле.
Мгновенно показывать их по ключевому слову.
К концу статьи у нас будет работающая команда 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. Разберём логику:-v keyword="$1"- передаем в awk первый аргумент функции (например,docker) как переменнуюkeyword.$0 ~ "^- " keyword " -$" { found=1; print; next }- если строка соответствует шаблону- docker -(гдеdocker- наш ключ), мы устанавливаем флагfound=1, печатаем эту строку-заголовок и переходим к следующей строке (next).found && /^- [a-zA-Z0-9]+ -$/ { found=0 }- если флагfoundустановлен и мы встречаем новую строку-заголовок (например,- git -), это значит, что блок с нашими командами закончился. Сбрасываем флагfound=0.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

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

Запуск без аргументов:
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)

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

Tony-Sol
14.10.2025 14:08Идея отличная. Реализация на bash выглядит как mvp, суда прям напрашивается четкая структура файла и полноценная утилита (на go/rust).
Файл может json/yaml, проще парсить, но сложнее редактировать руками или наоборот - md. Если будет md, это можно будет легко интегрировать в obsidian, так получится что в хранилище имеем шпаргалку, там ее правим/читаем/шарим, а в консоли через конфиг или переменную окружения подсовываем в cheat.
А если прям совсем угареть, можно синтегрироваться с fzf и zle (к сожалению не знаю альтернативы для bash) и искать нечетким поиском, а на выходе получить шаблон строки, где курсор уже в нужной позиции будет.

fraks
14.10.2025 14:08С одной стороны - просто и достаточно удобно. С другой - переизобретаем уже изобретенное.
Для чего делать один файл с секциями если можно на каждую секцию сделать по файлу, и не копать общий файл через awk. Бонусом имеем просмотр всех тем-ключевых слов просто в виде имен файлов, и файловая система будет сама следить за их уникальностью. в одном файле следить за уникальностью секций придется самостоятельно, и в большом файле может быть неудобно.
По большому счету - это переизобретение классического man который есть в любой системе. Добавляем в конфиг мана свою папку, что бы свои читы не класть в системные папки, и все работает. Правда писать странички на языке разметки манов не очень удобно.
Именовать файлы можно с расширением .md и писать с применением разметки. Тот же nano при редактировании .md-файлов автоматом подсвечивает разметку. Даже без исполнения этой разметки, только с подсвечиванием - это уже удобнее. Вывести тест в консоль с подсветкий синтаксиса можно программкой bat (примерно как cat только умеет подсвечивать множество синтаксисов).
Если ключевых слов наберется много, можно написать скриптик с применением fzf который покажет этот список, зафильтрует, даст выбрать один из (или не один) и даже можно сделать показ превью, через тот же bat с подсветкой синтаксиса.
Можно сделать много файлов с уточнением ключей, что бы итоговые файлы получались небольшие. Что бы среди них выбрать - запускаем их список через fzf, набирая буквы быстро фильтруем большой список, уточняя его до потребного состояния, из оставшегося выбираем нужное, выводим на экран. Кстати, через fzf можно не только выбрать, но и передать в командную строку не выполняя, потом подставляем руками нужный аргумент или редактируем - и готово.

eternaladm Автор
14.10.2025 14:08Для чего делать один файл с секциями если можно на каждую секцию сделать по файлу, и не копать общий файл через awk
Потому что создавать отдельный файл под одну команду в секции - долго. Да и зачем городить из обычной «шпаргалки» целую базу знаний. Под них действительно хватает качественных решений.
По большому счету - это переизобретение классического man который есть в любой системе.
Ни в коем случае, man не даст мне настолько просто добавить личную команду с нужными флагами.
Именовать файлы можно с расширением .md и писать с применением разметки. Тот же nano при редактировании .md-файлов автоматом подсвечивает разметку.
Согласен, тут полностью с Вами согласен, выше уже писали об этом. Со стороны .md на этот вопрос я не смотрел. Для себя искал быстрое и простое решение, а-ля минимализм.
Если ключевых слов наберется много, можно написать скриптик с применением fzf
Согласен, но это уже на утилиту смахивает, нежели на быстрое «решить здесь и сейчас, да еще и так, чтоб надолго хватило». Мой .cheatsheet состоит буквально из 10 команд, не хочется ради такого количества запариваться.
Подытоживая, свои потребности я закрыл целиком и полностью.

winorun
14.10.2025 14:08echo "git --log --oneline --graph --all #@brief Красивый лог" >> ~/.local/info/gitСамый минимализм
Запускаем
info --directory
~/.local/info/git git

winorun
14.10.2025 14:081) делаем длинную историю
2) при выполнении редких команд в конец добавляем комментарий, например
git --log --oneline --graph --all #@brief Красивый лог3) делаем grep по history

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

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

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

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

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

ollo71
14.10.2025 14:08при вызове без аргументов, имхо, удобнее так:
cat "$CHEAT_FILE" | grep "^- "
т.е. ключевые слова

quarus
14.10.2025 14:08Использую https://github.com/cheat/cheat
Утилита существует во многих пакетах.
Dominatos
https://github.com/dominatos/devtoolbox-cheats
вот ещё вариант, если кому нужно. Та же идёт уже с более чем 80 различных шпаргалок