Алиасы из .bashrc - это первое, что пишут в bash. Но когда их становится много, они начинают конфликтовать, не работают в скриптах, забываются через месяц и молча ломаются после обновлений.
А нужен был просто пульт: одна кнопка - одна команда, с документацией, автокомплитом и работой везде. Так появился me - инструмент, который наводит порядок во всём, что ты делаешь в терминале.
🖐️Эй!
Подписывайтесь на наш телеграм @r4ven_me📱, чтобы не пропустить новые публикации на сайте😉. А если есть вопросы или желание пообщаться по тематике - заглядывайте в Вороний чат @r4ven_me_chat🧐. Также в блоге теперь доступно соавторство 🐧🐧🐧.
Предисловие
Долгое время мой терминал напоминал мастерскую, где инструменты свалены в одну кучу, а половину из них уже не вспомнишь зачем брал. В .bashrc копились алиасы: я добавлял их, забывал, добавлял снова. Одни конфликтовали с другими, третьи не работали после обновления системы, четвёртые молча игнорировались в скриптах. Чтобы прибавить яркость экрана, я каждый раз гуглил busctl и каждый раз удивлялся, что не могу запомнить эту строку.
Я перепробовал разные способы навести порядок: писал отдельные скрипты, раскладывал по папкам, вешал на хоткеи. Всё это жило своей жизнью, не имело единой документации и не поддавалось контролю.
Мне нужен был не очередной лаунчер и не менеджер команд. Мне нужен был пульт. Как в старом магнитофоне: видишь все кнопки, нажимаешь - работает. Который можно взять с собой на другую машину, который не сломается от одной неверной строчки и в котором каждая кнопка сама рассказывает, что делает.
Так появился me.
Как это выглядит

me int: открывается fzf со списком методов. Справа - preview с описанием и примером. При загруженном me.completion выбор печатается и попадает в историю Bash. Жмём ↑, проверяем команду и выполняем Enter.
Вводные данные
Здесь разобрано состояние ветки main на коммите 8887023 от 22 октября 2026 года, лицензия GNU GPLv3. В README встречается обозначение v3.5, а переход на новую архитектуру назван 2.0, поэтому для воспроизводимости ориентируемся на коммит. Состав: bash-движок (~/.local/bin/me/me), реестр (~/.config/me/me.conf) и отдельные исполняемые скрипты методов в ~/.local/bin/me/me_lib/.
| ПО | Версия / статус |
|---|---|
me | main, 8887023 |
bash | 4.0+ |
fzf | для интерактивных методов |
playerctl | для управления MPRIS-плеерами |
ripgrep | ставит установщик |
ffmpeg | опционально |
Отдельные методы тянут за собой свои утилиты. Например, для me smy нужны yt-dlp, fzf и mpv, для поиска me fi - ещё и редактор micro. Не все методы проверяют зависимости: текущий smy.sh сразу вызывает утилиты и подавляет stderr у yt-dlp. Если поиск ничего не показывает, сначала проверь command -v yt-dlp fzf mpv. Управление mpv через playerctl требует MPRIS-интеграции плеера; одного установленного mpv недостаточно.
Установка me
Сначала зависимости. Ниже - базовый набор; дополнительные программы зависят от выбранных методов:
# На Arch:
sudo pacman -S git bash fzf playerctl ripgrep ffmpeg
# На Debian/Ubuntu:
sudo apt install git bash fzf playerctl ripgrep ffmpeg
# На Alpine:
sudo apk add git bash fzf playerctl ripgrep ffmpegЗатем скачиваем репозиторий:
mkdir -p "$HOME/.local/bin"
git clone https://github.com/totiks2012/me "$HOME/.local/bin/me"
# Состояние репозитория, на котором проверены примеры статьи:
git -C "$HOME/.local/bin/me" checkout 8887023083e695a0c649436dec45b8ff8b7d1e95Перед запуском установщика коротко о том, что он делает. Скрипт небольшой, исходник можно посмотреть на GitHub, лучше прочитать до запуска:
- Права - выставляет
+xфайлам с shebang, найденным по маскамme*,install_me.shиme_lib/*; - Конфиг - копирует
me.confв~/.config/me/, существующий файл не затирает; - Установщики методов - запускает
gifx_install.sh,scr_install.shиinstall_yfe.sh(сначала ищет их в корнеme/, потом вme_lib/); - PATH - дописывает
export PATHс каталогом~/.local/bin/meв~/.bashrcи~/.profile, если там его ещё нет; - Автокомплит - добавляет
sourceдляme_lib/me.completionв~/.bashrc; - ripgrep - если
rgне найден, ставит его черезapt-get,pacmanилиapk. Для этого понадобитсяsudo, поднимается он только в момент установки пакета.
Установщик запускает подустановщики не только самого пульта, но и методов для рабочего стола. Установщики GIF и скриншотов используют apt-get: на Arch/Alpine полный сценарий нельзя считать универсальным. Они также могут менять настройки хоткеев и запрашивать sudo. Если это подходит твоей системе, запускаем от обычного пользователя, не через sudo bash:
cd ~/.local/bin/me
bash install_me.shДля минимальной установки без подустановщиков и изменения файлов оболочки можно вместо этого выполнить:
cd "$HOME/.local/bin/me"
chmod +x me
find me_lib -maxdepth 1 -type f -exec chmod u+x {} \;
mkdir -p "$HOME/.config/me"
# Существующий конфиг не перезаписываем.
if [ ! -e "$HOME/.config/me/me.conf" ]; then
cp me.conf "$HOME/.config/me/me.conf"
fiЕсли конфиг остался от старой версии с функциями me_method_*(), установщик его не мигрирует. Сначала сохрани копию и перенеси методы в отдельные скрипты с записями #@script: по примеру ниже.
Изменения окружения внутри установщика не попадают в родительскую оболочку. В текущем Bash явно добавляем каталог в PATH и загружаем автокомплит с обёрткой для me int:
export PATH="$HOME/.local/bin/me:$PATH"
source "$HOME/.local/bin/me/me_lib/me.completion"
meПосле полной установки новые сеансы Bash получат эти настройки из .bashrc/.profile. После минимальной установки для постоянной работы добавь две строки выше (export и source) в ~/.bashrc сам. Для других оболочек Bash completion не подходит; сам исполняемый файл me можно вызывать по полному пути.
Первый метод
В текущей архитектуре функция внутри me.conf не запустится: конфиг содержит только метаданные и путь к исполняемому файлу. Создадим скрипт:
cat > "$HOME/.local/bin/me/me_lib/hello.sh" <<'EOF'
#!/usr/bin/env bash
printf 'Привет, %s!\n' "${1:-терминал}"
EOF
chmod +x "$HOME/.local/bin/me/me_lib/hello.sh"Открой ~/.config/me/me.conf и добавь блок (если метода hello там ещё нет):
#@method: hello
#@description: Моя первая команда
#@example: me hello ; me hello "мир"
#@script: me_lib/hello.shВызываем:
me hello
me hello "мир"Относительный путь в #@script: считается от ~/.local/bin/me/, а не от текущего каталога и не от папки конфига. Абсолютный путь тоже допустим. ~ и $HOME внутри этого тега не раскрываются: для внешнего скрипта указывай полный путь вроде /home/user/bin/hello.sh. Кавычки вокруг самого пути в теге не нужны.
Если файл не найден или не исполняемый, движок сообщит об этом. Синтаксис своего Bash-скрипта можно отдельно проверить: bash -n "$HOME/.local/bin/me/me_lib/hello.sh".
В терминале станет уютно. Не магически, а просто потому, что команды, которые ты используешь каждый день, лежат на видном месте и сами рассказывают, что делают. Как пульт от старого магнитофона.
Что болит в алиасах из .bashrc
Для меня алиас - это крючок, на который я вешаю команду. Удобно, пока крючков пять. А когда их тридцать, они начинают выпадать: один не туда забили, второй отвалился после обновления, третий молча конфликтует с четвёртым. И главное - в скриптах этих крючков вообще нет. Вот что я вынес из долгой жизни с .bashrc:
| Проблема | Почему это больно |
|---|---|
| Не работают в скриптах | Bash-скрипты не видят алиасы без shopt -s expand_aliases (который никто не ставит). Скрипт с алиасами упадёт на другой машине - будешь искать, почему. |
| Нет документации | Через месяц не помнишь, что делает alias rd='rm -rf', а что alias rd='rdesktop'. Начинается grep alias ~/.bashrc - и так каждый раз. |
| Аргументы только в конец | alias backup='tar -czf' - передать путь в середину нельзя. Нужна функция, но в .bashrc это ещё одна свалка. |
| Нет проверок | Проверки и обработку ошибок нужно писать самому. Алиас возвращает статус команды, но не добавляет диагностику автоматически. |
| Нет изоляции | Все алиасы в одной куче. Переменные, export-ы, кастомные функции - перемешано. Контроль версий? Руками вырезать из .bashrc. |
| Конфликты имён | Два алиаса с одинаковым именем - молча побеждает последний. Диагностики нет. |
| Только для ручного ввода | Нельзя вызвать из скрипта, нельзя передать по fifo, нельзя привязать к хоткею в i3 как надёжную команду. |

.bashrc, в котором алиасы перемешаны с export-ами, комментариями, завершениями и забытыми функциями. Справа - me.conf: чистая колонка методов с аннотациями. Размер файла сопоставим, но читаемость разная.
Что предлагает me
me родился как реестр всего, что я делаю в терминале. Это bash-скрипт (~/.local/bin/me/me) плюс конфиг (~/.config/me/me.conf). В конфиге описываются методы с мета-тегами, вызываются они через me <глагол>.
Архитектура - три слоя:
терминал / скрипт / хоткей
│
▼
me (bash-движок)
│
▼
me.conf (реестр методов)
│
├── #@script: me_lib/play.sh
├── #@script: me_lib/upgrade.sh
└── #@script: me_lib/ff.sh
│
▼
отдельный процессМысль вслух: я специально сделал так, чтобы движок не грузил всё подряд. Сам же обламывался, когда один сломанный .bashrc ронял весь шелл. Здесь, если один метод упал, остальные работают. Мне это кажется правильным.
Как это выглядит на практике
Я люблю слушать музыку через mpv в фоне. Раньше, чтобы поставить на паузу, я лез в терминал и набирал busctl с километровым путём - безумие. Сейчас просто жму me pause или, если руки заняты, переключаю через горячую клавишу, которая вызывает me toggle. То же самое с яркостью.
Было:
busctl --user call org.xfce.PowerManager \
/org/xfce/PowerManager \
org.xfce.Power.Backlight IncreaseBrightnessСтало:
me bright upРазница не в том, что второй вариант короче, а в том, что у него есть:
- Документация -
me -m brightпокажет описание и пример; - Автокомплит - Tab подставит имя
bright; аргументыup/downтекущий completion не дополняет; - Уведомление - после изменения яркости срабатывает
notify-send; - Fallback - если XFCE не работает, пробует GNOME;
- Интерактив -
me int→fzf→ выбор → команда в истории Bash (если загруженme.completion, жми ↑, затем Enter).
Мысль вслух: честно говоря, я перестал запоминать названия методов. Когда печатаю me int, вижу список и просто выбираю. Как быстрый запуск в телефоне, только в терминале.
Как устроен метод формально
Каждый метод - запись в реестре и отдельный исполняемый скрипт. Например, запись для паузы выглядит так:
#@method: pause
#@description: [cat: media] Поставить плеер на паузу через playerctl
#@example: me pause
#@script: me_lib/pause.shКогда вызывается me pause, движок:
- Находит
#@script:в блоке метода черезawk; - Разрешает путь относительно
~/.local/bin/me/и проверяет наличие файла и право исполнения; - Запускает
"$sdir" "$@"в дочернем процессе и возвращает его код завершения.
Ни source конфига, ни eval, ни загрузки тел функций здесь больше нет. Движок не проверяет скрипт через bash -n перед каждым запуском: это можно сделать вручную. Ошибка в одном скрипте не мешает запускать другие методы, но не отменяет действий, которые он успел выполнить. Отдельный процесс - не песочница: скрипт работает с правами пользователя.
Ещё один пример с аргументами - свой метод press. Его нет в штатном реестре. Он использует xdotool и предназначен для X11, не для нативных приложений Wayland/Sway.
Создадим файл:
cat > "$HOME/.local/bin/me/me_lib/press.sh" <<'EOF'
#!/usr/bin/env bash
if [ "$#" -eq 0 ]; then
echo "Укажи комбинацию: me press ctrl+t" >&2
exit 1
fi
if ! command -v xdotool >/dev/null 2>&1; then
echo "Установи xdotool; метод предназначен для X11" >&2
exit 1
fi
exec xdotool key "$1"
EOF
chmod +x "$HOME/.local/bin/me/me_lib/press.sh"И добавим в ~/.config/me/me.conf:
#@method: press
#@description: Комбинация клавиш через xdotool (X11)
#@example: me press ctrl+shift+t
#@script: me_lib/press.shТеперь его можно вызвать вручную: me press ctrl+shift+t. Результат зависит от приложения в фокусе и его сочетаний клавиш. Для хоткеев оконного менеджера надёжнее указывать полный путь к me; наличие команды в PATH интерактивного Bash не гарантирует её наличие в окружении оконного менеджера.
Чего нет у алиасов
Без me ты пишешь:
query="led zeppelin kashmir"
url=$(yt-dlp --flat-playlist --print $'%(title)s\t%(url)s' "ytsearch20:$query" | \
fzf --reverse --delimiter=$'\t' --with-nth=1 | cut -f2)
if [ -n "$url" ]; then
mpv --no-video "$url"
fiС me это:
me smy "led zeppelin kashmir"Не потому что me умный. А потому что smy - метод в библиотеке me_lib/smy.sh, в котором вся логика вынесена в отдельный скрипт:
- запрос через
yt-dlp(зависимости нужно установить заранее); - поиск 20 результатов →
fzf→ выбор; - воспроизведение в
mpv.
Алиас - текстовая подстановка, а не отдельная программа. Он может содержать проверки и возвращает статус выполненной команды, но не даёт собственных позиционных аргументов. В неинтерактивном Bash раскрытие алиасов по умолчанию выключено; другие оболочки тоже поддерживают алиасы, но определения из .bashrc туда сами не попадут.
Те же проверки и обработку аргументов можно написать в обычной shell-функции или скрипте без me. Польза пульта - в едином реестре, справке и выборе методов. Открыв me.conf, видишь назначение команды и путь к её реализации.
Что даёт переезд с алиасов на me
1. Централизованное управление
Вместо 50 строк в .bashrc - реестр ~/.config/me/me.conf и скрипты в ~/.local/bin/me/me_lib/. Их можно положить в git, диффить, откатывать. Важно хранить под контролем версий не только реестр, но и сами реализации методов.
2. Документирование по факту
Мета-теги #@description: и #@example: пишутся один раз, при создании метода. Через месяц me покажет справку, через год - тоже.
3. Скриптовая совместимость
me можно вызывать из скрипта, cron, systemd --user и хоткеев оконного менеджера. Но работа конкретного метода зависит от его утилит и окружения: например, pause требует доступа к пользовательской D-Bus-сессии и MPRIS-плееру.
4. Окружение не теряется
Одна из частых проблем при вынесении команд в отдельные скрипты - пропавшие переменные окружения: DISPLAY, DBUS_SESSION_BUS_ADDRESS, PULSE_SERVER. Без них перестают работать уведомления, яркость и звук.
me не запускает методы через setsid или env -i: каждый скрипт - обычный дочерний процесс ("$sdir" "$@"). Он наследует экспортированные переменные того, кто вызвал me. Например, для созданного выше X11-метода:
# :0 - только пример; используй DISPLAY своей X11-сессии.
DISPLAY=:0 me press ctrl+shift+tЭто обычное наследование окружения Unix, а не особое свойство me. Скрипт в /usr/local/bin ведёт себя так же, если запущен тем же пользователем из той же сессии.
Важно: cron и systemd --user не обязаны иметь все переменные графической сессии. Одного DISPLAY может быть недостаточно: нужны корректные D-Bus-адрес, XDG_RUNTIME_DIR, а для X11 иногда и XAUTHORITY. Для фоновых задач указывай полный путь к me и настраивай окружение под конкретный метод; универсальной строки crontab для всех GUI-команд нет.
Отказ от eval означает другое: реестр не исполняется как код, а методы запускаются из отдельных файлов. Свой Bash-скрипт можно проверить через bash -n независимо от пульта.
5. Портативность без привязки к .bashrc
На разных Linux-машинах .bashrc часто сильно отличается: в одном дистрибутиве он загружает bash_completion, в другом - profile.d, в третьем - кастомные переменные для GUI. Вычленять алиасы из этого зоопарка и переносить на новую систему муторно и чревато конфликтами.
Реестр ~/.config/me/me.conf не зависит от настроек оболочки. Для переноса нужны обе директории: ~/.config/me/ и ~/.local/bin/me/. От .bashrc сам диспетчер почти не зависит: установщик дописывает туда PATH и автокомплит.
На новой машине отдельно устанавливаются зависимости методов. Абсолютные пути в реестре, различия окружений рабочего стола и привязанные к машине конфиги нужно проверить вручную: копирование двух папок не гарантирует работу всех команд.
6. Изоляция ошибок
Синтаксическая ошибка в скрипте видна при его запуске, и me возвращает статус этого процесса. Остальные методы при следующих вызовах доступны: их файлы не загружаются вместе с ошибочным скриптом.
7. Расширяемость без коллизий
Новый метод - блок метаданных в me.conf и исполняемый скрипт. Генератор me create проверяет имя на занятость, но при ручном редактировании за уникальностью нужно следить самому: движок не диагностирует дубликаты.
8. Интерактивный выбор
me int → fzf со списком методов, preview, пример. Сам движок только печатает выбранную команду, не выполняя её. Загруженная в Bash обёртка из me.completion добавляет её в историю: нажми ↑, при необходимости допиши аргументы и выполни Enter. Без обёртки увидишь только строку в stdout. Если fzf отсутствует, у самого me int есть текстовое меню, но у многих библиотечных методов его нет.
9. Социальное - share/import
Копировать me.conf - это полдела: нужны и скрипты, на которые он ссылается. Для упаковки и переноса есть share/import, но в проверенном коммите их регистрация сломана.
В me.conf указаны me_lib/share_launcher.sh и me_lib/import.sh, которых в этом коммите нет. Поэтому me share и me import на чистой установке не работают. Сама реализация обеих операций есть в me_lib/share.sh; ниже используем её напрямую.
# На исходной машине: пакет созданного выше hello.
bash "$HOME/.local/bin/me/me_lib/share.sh" share hello
# Результат: ~/.local/bin/me/import/hello.tar.gz
# На целевой машине после копирования туда архива:
bash "$HOME/.local/bin/me/me_lib/share.sh" import ./hello.tar.gzВнутри пакета - метаданные, найденные локальные файлы и install.sh. Поиск зависимостей эвристический: системные пакеты не устанавливаются, а динамически вычисляемые пути могут не попасть в архив. Перед передачей проверь содержимое. Импорт выполняет install.sh из архива с твоими правами, поэтому используй только доверенные пакеты.
10. Кэшируется справка, а не код
Общий список методов хранится в ~/.cache/me/me.cache, хеш реестра - в ~/.cache/me/me.hash. При выводе общей справки движок сравнивает хеши и при необходимости пересобирает текст. Кэша тел методов в /dev/shm больше нет: путь к скрипту читается из реестра при вызове. После изменения скрипта пересборка кэша не нужна.
Список методов
Список неполный: в репозиторий я докидываю методы по мере готовности. В me.conf может просочиться метод, файлы которого ещё не опубликованы. На работу me это не влияет, он просто скажет, что файлы метода не найдены.
Система
| Команда | Что делает | Пример |
|---|---|---|
me vol up/down/mute | Громкость (pulseaudio → alsa fallback) | me vol up |
me bright up/down | Яркость (XFCE → GNOME fallback через D-Bus) | me bright down |
me upgrade | Обновление системы (pacman/apt/apk) | me upgrade |
me restart | Перезагрузка через systemctl | me restart |
me offnow | Выключение через systemctl | me offnow |
me logout | Выход из сессии через loginctl | me logout |
me stat | Срез состояния: CPU, батарея, громкость | me stat |
me status [сервис] | Список активных сервисов или статус | me status dbus_tamer |
me on <сервис> | Запуск systemd-сервиса | me on dbus_tamer |
me off <сервис> | Остановка systemd-сервиса | me off dbus_tamer |
Медиа
| Команда | Что делает | Пример |
|---|---|---|
me play/pause/stop | MPRIS-управление плеером | me pause |
me next/prev/toggle | Навигация по трекам | me toggle |
me smy <запрос> | Поиск музыки на YouTube → mpv | me smy "kashmir" |
me svy <запрос> | Поиск видео на YouTube → mpv 720p | me svy "linux review" |
me say <текст> | Уведомление на экран | me say "Готово" "Бэкап завершён" |
Утилиты
| Команда | Что делает | Пример |
|---|---|---|
me fi -c <текст> [путь] | Поиск по содержимому (ripgrep + fzf + micro) | me fi -c "TODO" . |
me fi -s <имя> [путь] | Поиск по имени (find + fzf, открытие через micro/thunar) | me fi -s "config" "$HOME/.config" |
me ff | Интерактивный конструктор ffmpeg (обрезать/склеить) | me ff |
me calc <формула> | Калькулятор (bc с тригонометрией) | me calc "sqrt(2^10)" |
me id -s <текст> | Сохранить заметку/идею | me id -s "Купить транзисторы" |
me id -r | Показать список заметок через fzf | me id -r |
me run <имя> | Запустить скрипт по имени из ~/.local/bin/ | me run pam4.sh |
me color <цвет> <текст> | Окрасить текст в терминале | me color red "Ошибка" |
me uni_tables <колонки> | Форматировать таблицы с авторасчётом ширины | me uni_tables "A" "B" |
me itag | Редактор ID3-тегов MP3/FLAC (fzf + micro + mutagen) | me itag |
me crossfade [путь] | Склейка MP3 с плавным наложением (ffmpeg) | me crossfade |
me gifx | Запись GIF/MP4 области экрана (F5 - старт/стоп) | me gifx |
me wfb | Открыть книгу из буфера обмена в браузере | me wfb |
Без пути fi ищет от /, а не в текущем каталоге, поэтому в примерах путь задан явно. Необязательный фильтр имени для -c передаётся после пути и интерпретируется как регулярное выражение grep, а не glob: me fi -c "TODO" . '\.c$'.
Коммуникация
| Команда | Что делает | Пример |
|---|---|---|
bash ~/.local/bin/me/me_lib/share.sh share <метод> | Собрать локальные файлы метода в архив | bash ~/.local/bin/me/me_lib/share.sh share hello |
bash ~/.local/bin/me/me_lib/share.sh import <архив> | Импортировать локальный tar.gz | bash ~/.local/bin/me/me_lib/share.sh import ./hello.tar.gz |
Навигация
| Команда | Что делает | Пример |
|---|---|---|
me | Вывести справку со всеми методами | me |
me -m <метод> | Справка по одному методу | me -m ff |
me int | Интерактивный выбор через fzf | me int |

me (список всех методов) → me -m smy (описание smy) → me smy "запрос" (поиск и воспроизведение). Три режима в одном скринкасте.
Версионирование файлов с cit
Помимо вызова готовых методов, me даёт инструмент для лёгкого версионирования файлов - cit. Это не замена Git, а способ сохранять состояния файлов прямо в процессе работы, без инициализации репозитория и коммитов.
cit хранит снепшоты (слепки) файлов в .cit/ текущего рабочего каталога. Запускай его из корня нужного проекта. Имена хранилища кодируют абсолютные пути исходных файлов, поэтому это не переносимая история, как в Git. Слепок содержит копию файла и комментарий - ченджлог; формат имени: имя_файла__дд-мм-гггг_чч-мм-сс.cit.
Основные операции:
- Создать снепшот (Push) - выбрать файлы или папки через
fzf, ввести комментарий. Снепшот сохраняется с меткой времени. Если файл содержит shebang (#!), комментарий автоматически вставляется в его заголовок; - Откат к предыдущей версии - текущий файл заменяется последним снепшотом из
.cit/; - Выбор версии для восстановления - через
fzfпоказываются все снепшоты с их ченджлогами, выбранный копируется поверх текущего файла; - Удаление в корзину - снепшот перемещается в
.cit/tr_cit/с сохранением структуры путей, версии не удаляются безвозвратно; - Восстановление из корзины - список удалённых снепшотов с возможностью вернуть их обратно в основное хранилище;
- Очистка корзины - полностью удаляет все снепшоты из
.cit/tr_cit/.
При откате текущий файл перемещается в <файл>.WIP, но следующий откат может перезаписать эту копию. При выборе версии и финализации не рассчитывай на автоматическое сохранение текущих правок. Перед такими операциями сделай отдельную резервную копию.
Флаг -f (finalize) собирает ченджлоги и перезаписывает исходный файл содержимым выбранного кодом последнего слепка, добавляя журнал в поддерживаемых форматах. Одновременно создаёт копию с суффиксом -F и отдельный лог-файл. Несохранённые в слепок изменения при этом теряются. Есть и ограничение реализации: даты ДД-ММ-ГГГГ сортируются как строки, поэтому при переходе месяца/года «последний» слепок может оказаться не самым новым.
Рабочие точки входа:
# Из каталога проекта:
me cit # интерактивное меню
# Только после резервной копии и проверки нужного слепка:
me cit -f # интерактивная финализацияДля cit нужны fzf и интерактивный терминал. Объявленные в me.conf команды me cit save <файл>, list, load, diff текущим скриптом не реализованы: вместо них откроется обычное меню. Отдельного CLI-diff нет; сравнение слепков есть в preview меню. Прямой вызов cit без me также требует отдельно добавить me_lib в PATH; штатная установка этого не делает.
Генерация метода через me create
Часто спрашивают: “а как быстро добавить новый метод?”. Писать блок в me.conf руками - 30 секунд, но можно быстрее.
Запускается me create без имени в аргументе: имя скрипт спрашивает сам. Допустимы строчные латинские буквы, цифры и _, первый символ - буква или _. Дефис в docker-ps не пройдёт проверку; используем docker_ps.
Генератор:
- Спрашивает имя, описание, запускаемую команду и пример;
- Создаёт лаунчер
me_lib/<имя>.shсо строкойexec <команда> "$@"; - Проверяет лаунчер через
bash -n; - После подтверждения делает файл исполняемым и добавляет блок метаданных в конец
me.conf.
Пример ответов в порядке вопросов (Docker должен быть установлен, а пользователь - иметь доступ к нему):
$ me create
Имя метода: docker_ps
Описание: Список запущенных Docker-контейнеров
> docker ps
Пример (Enter = 'me docker_ps'): me docker_ps
Добавить? (Y/n): yБудет создан скрипт с командой:
exec docker ps "$@"И запись в реестре:
#@method: docker_ps
#@description: Список запущенных Docker-контейнеров
#@example: me docker_ps
#@script: me_lib/docker_ps.shТеперь работают me docker_ps и me docker_ps --all. Генератор принимает не только путь, но и командную строку, которую буквально вставляет в лаунчер. Для условий, конвейеров и сложной логики лучше написать отдельный скрипт и указать его путь: автоматическая вставка exec и "$@" не подходит произвольному shell-коду. Проверка bash -n не проверяет наличие Docker и права доступа к нему.
Перед созданием проверь, что файл me_lib/docker_ps.sh не занят: проверка дубликата имени в реестре не защищает незарегистрированный файл от перезаписи.
Масштабирование на парк машин
Для переноса набора методов можно использовать ту же реализацию share.sh напрямую, обходя отсутствующие в проверенном коммите обёртки:
# На исходной машине:
bash "$HOME/.local/bin/me/me_lib/share.sh" share -all
# Результат: ~/.local/bin/me/import/me_all.tar.gz
# На целевой машине после установки me и копирования архива:
bash "$HOME/.local/bin/me/me_lib/share.sh" import -diff ./me_all.tar.gz
bash "$HOME/.local/bin/me/me_lib/share.sh" import -all ./me_all.tar.gz-diff показывает различия, но не является аудитом install.sh. Batch-импорт без -f пропускает существующие методы; -all -f разрешает их замену. Пакет -all включает все файлы me_lib/, поэтому перед отправкой проверь, нет ли там приватных данных. Импорт по URL текущим кодом не поддерживается: архив нужно сначала скачать и проверить отдельно.
Сценарий для парка машин:
- На мастер-машине создаётся набор методов;
- Через
share.sh shareсобираются отдельные пакеты или общий архив; - Архивы передаются через
scp,rsyncили общую папку; - На каждой целевой машине после проверки пакета выполняется
share.sh importс локальным путём; - Отдельно устанавливаются системные зависимости и проверяется окружение методов.
Это способ переносить скрипты и их регистрацию, а не полноценная система управления конфигурациями. Имена общих и личных методов нужно согласовывать: автоматического пространства имён у me нет.
Цифры
В проверенном me.conf зарегистрировано 48 методов, но наличие записи ещё не означает наличие рабочего скрипта и всех его зависимостей. Поэтому надёжнее смотреть не только на количество команд, но и на код конкретного метода.
Движок написан на Bash и использует стандартные утилиты вроде awk и md5sum. fzf, playerctl, ripgrep, ffmpeg и другие программы нужны соответствующим методам, а не каждому вызову me.
Прежние оценки времени запуска и размера здесь не привожу: они относились к старому движку с eval и кэшем в /dev/shm и не подтверждают производительность текущей реализации.
Почему это просто инструмент
В me нет:
- автоматического разрешения всех зависимостей методов;
- обязательного YAML/TOML/JSON для реестра;
- отдельного плагинного API: метод - обычный исполняемый файл;
- ORM, DI, middleware и прочего.
В движке me есть:
awk, который находит путь к скрипту в реестре;- проверка наличия файла и права исполнения;
- прямой запуск скрипта с аргументами;
- текстовый кэш справки в
~/.cache/me/иmd5sumдля его автоинвалидации.
bash -n используется генератором create для проверки нового лаунчера, а не диспетчером при каждом вызове метода.
Всё. Именно поэтому это работает: нет прослойки между тобой и терминалом.
Когда не нужно
me не делает следующего:
- не заменяет
man/info- сложные тулы читай через их документацию; - не автоматизирует то, что делаешь раз в год;
- не превращает терминал в GUI.
Если у тебя 3 алиаса и они работают, me не нужен. Если же ты тратишь время на то, чтобы вспомнить, нагуглить или написать команду, которую используешь ежедневно, me может убрать этот шаг.

me (поиск в истории, grep .bashrc), справа - me int (список команд за секунду).
Послесловие
Сейчас я не представляю свою работу без me. Он стал моим вторым языком для терминала. Если ты чувствуешь такую же боль - попробуй.
Это не фреймворк и не попытка заменить оболочку. Просто аккуратная полка для команд, которые иначе жили бы в .bashrc и забывались.
Используемые материалы
👨💻Ну и…
Не забывайте про нашу телегу📱и чат 💬
Или может хотите стать соавтором? Тогда клик сюда🔗
Всех благ✌️
That should be it. If not, check the logs 🙂


