me - Терминал, в котором уютно
Приветствую!
Имя: Totiks Контакты: totiks2012@gmail.com Обо мне: Любитель Linux с 2007 года. Всё началось с Puppy Linux - он стал моим входом в мир live-систем, и с тех пор я из них не вылезаю. Сейчас мой основной дистрибутив - кастомный Debian Dog. Ссылки:

Алиасы из .bashrc - это первое, что пишут в bash. Но когда их становится много, они начинают конфликтовать, не работают в скриптах, забываются через месяц и молча ломаются после обновлений.

А нужен был просто пульт: одна кнопка - одна команда, с документацией, автокомплитом и работой везде. Так появился me - инструмент, который наводит порядок во всём, что ты делаешь в терминале.

Предисловие

Долгое время мой терминал напоминал мастерскую, где инструменты свалены в одну кучу, а половину из них уже не вспомнишь зачем брал. В .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/.

ПОВерсия / статус
memain, 8887023
bash4.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

Сначала зависимости. Ниже - базовый набор; дополнительные программы зависят от выбранных методов:

BASH
# На 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
Нажмите, чтобы развернуть и увидеть больше

Затем скачиваем репозиторий:

BASH
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, лучше прочитать до запуска:

Установщик запускает подустановщики не только самого пульта, но и методов для рабочего стола. Установщики GIF и скриншотов используют apt-get: на Arch/Alpine полный сценарий нельзя считать универсальным. Они также могут менять настройки хоткеев и запрашивать sudo. Если это подходит твоей системе, запускаем от обычного пользователя, не через sudo bash:

BASH
cd ~/.local/bin/me
bash install_me.sh
Нажмите, чтобы развернуть и увидеть больше

Для минимальной установки без подустановщиков и изменения файлов оболочки можно вместо этого выполнить:

BASH
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:

BASH
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 не запустится: конфиг содержит только метаданные и путь к исполняемому файлу. Создадим скрипт:

BASH
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 там ещё нет):

BASH
#@method: hello
#@description: Моя первая команда
#@example: me hello ; me hello "мир"
#@script: me_lib/hello.sh
Нажмите, чтобы развернуть и увидеть больше

Вызываем:

BASH
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 <глагол>.

Архитектура - три слоя:

PLAINTEXT
терминал / скрипт / хоткей
        │
        ▼
  me (bash-движок)
        │
        ▼
  me.conf (реестр методов)
        │
        ├── #@script: me_lib/play.sh
        ├── #@script: me_lib/upgrade.sh
        └── #@script: me_lib/ff.sh
                     │
                     ▼
              отдельный процесс
Нажмите, чтобы развернуть и увидеть больше

Как это выглядит на практике

Я люблю слушать музыку через mpv в фоне. Раньше, чтобы поставить на паузу, я лез в терминал и набирал busctl с километровым путём - безумие. Сейчас просто жму me pause или, если руки заняты, переключаю через горячую клавишу, которая вызывает me toggle. То же самое с яркостью.

Было:

BASH
busctl --user call org.xfce.PowerManager \
  /org/xfce/PowerManager \
  org.xfce.Power.Backlight IncreaseBrightness
Нажмите, чтобы развернуть и увидеть больше

Стало:

BASH
me bright up
Нажмите, чтобы развернуть и увидеть больше

Разница не в том, что второй вариант короче, а в том, что у него есть:

Как устроен метод формально

Каждый метод - запись в реестре и отдельный исполняемый скрипт. Например, запись для паузы выглядит так:

BASH
#@method: pause
#@description: [cat: media] Поставить плеер на паузу через playerctl
#@example: me pause
#@script: me_lib/pause.sh
Нажмите, чтобы развернуть и увидеть больше

Когда вызывается me pause, движок:

  1. Находит #@script: в блоке метода через awk;
  2. Разрешает путь относительно ~/.local/bin/me/ и проверяет наличие файла и право исполнения;
  3. Запускает "$sdir" "$@" в дочернем процессе и возвращает его код завершения.

Ни source конфига, ни eval, ни загрузки тел функций здесь больше нет. Движок не проверяет скрипт через bash -n перед каждым запуском: это можно сделать вручную. Ошибка в одном скрипте не мешает запускать другие методы, но не отменяет действий, которые он успел выполнить. Отдельный процесс - не песочница: скрипт работает с правами пользователя.

Ещё один пример с аргументами - свой метод press. Его нет в штатном реестре. Он использует xdotool и предназначен для X11, не для нативных приложений Wayland/Sway.

Создадим файл:

BASH
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:

BASH
#@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 ты пишешь:

BASH
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 это:

BASH
me smy "led zeppelin kashmir"
Нажмите, чтобы развернуть и увидеть больше

Не потому что me умный. А потому что smy - метод в библиотеке me_lib/smy.sh, в котором вся логика вынесена в отдельный скрипт:

Алиас - текстовая подстановка, а не отдельная программа. Он может содержать проверки и возвращает статус выполненной команды, но не даёт собственных позиционных аргументов. В неинтерактивном 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-метода:

BASH
# :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, но в проверенном коммите их регистрация сломана.

BASH
# На исходной машине: пакет созданного выше 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Перезагрузка через systemctlme restart
me offnowВыключение через systemctlme offnow
me logoutВыход из сессии через loginctlme 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/stopMPRIS-управление плееромme pause
me next/prev/toggleНавигация по трекамme toggle
me smy <запрос>Поиск музыки на YouTube → mpvme smy "kashmir"
me svy <запрос>Поиск видео на YouTube → mpv 720pme 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Показать список заметок через fzfme 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.gzbash ~/.local/bin/me/me_lib/share.sh import ./hello.tar.gz

Навигация

КомандаЧто делаетПример
meВывести справку со всеми методамиme
me -m <метод>Справка по одному методуme -m ff
me intИнтерактивный выбор через fzfme int

me_library_animation.gif
Последовательность: me (список всех методов) → me -m smy (описание smy) → me smy "запрос" (поиск и воспроизведение). Три режима в одном скринкасте.

Версионирование файлов с cit

Помимо вызова готовых методов, me даёт инструмент для лёгкого версионирования файлов - cit. Это не замена Git, а способ сохранять состояния файлов прямо в процессе работы, без инициализации репозитория и коммитов.

cit хранит снепшоты (слепки) файлов в .cit/ текущего рабочего каталога. Запускай его из корня нужного проекта. Имена хранилища кодируют абсолютные пути исходных файлов, поэтому это не переносимая история, как в Git. Слепок содержит копию файла и комментарий - ченджлог; формат имени: имя_файла__дд-мм-гггг_чч-мм-сс.cit.

Основные операции:

Флаг -f (finalize) собирает ченджлоги и перезаписывает исходный файл содержимым выбранного кодом последнего слепка, добавляя журнал в поддерживаемых форматах. Одновременно создаёт копию с суффиксом -F и отдельный лог-файл. Несохранённые в слепок изменения при этом теряются. Есть и ограничение реализации: даты ДД-ММ-ГГГГ сортируются как строки, поэтому при переходе месяца/года «последний» слепок может оказаться не самым новым.

Рабочие точки входа:

BASH
# Из каталога проекта:
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.

Генератор:

  1. Спрашивает имя, описание, запускаемую команду и пример;
  2. Создаёт лаунчер me_lib/<имя>.sh со строкой exec <команда> "$@";
  3. Проверяет лаунчер через bash -n;
  4. После подтверждения делает файл исполняемым и добавляет блок метаданных в конец me.conf.

Пример ответов в порядке вопросов (Docker должен быть установлен, а пользователь - иметь доступ к нему):

Вывод
$ me create
Имя метода: docker_ps
Описание: Список запущенных Docker-контейнеров
> docker ps
Пример (Enter = 'me docker_ps'): me docker_ps
Добавить? (Y/n): y
Нажмите, чтобы развернуть и увидеть больше

Будет создан скрипт с командой:

BASH
exec docker ps "$@"
Нажмите, чтобы развернуть и увидеть больше

И запись в реестре:

BASH
#@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
# На исходной машине:
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 текущим кодом не поддерживается: архив нужно сначала скачать и проверить отдельно.

Сценарий для парка машин:

  1. На мастер-машине создаётся набор методов;
  2. Через share.sh share собираются отдельные пакеты или общий архив;
  3. Архивы передаются через scp, rsync или общую папку;
  4. На каждой целевой машине после проверки пакета выполняется share.sh import с локальным путём;
  5. Отдельно устанавливаются системные зависимости и проверяется окружение методов.

Это способ переносить скрипты и их регистрацию, а не полноценная система управления конфигурациями. Имена общих и личных методов нужно согласовывать: автоматического пространства имён у me нет.

Цифры

В проверенном me.conf зарегистрировано 48 методов, но наличие записи ещё не означает наличие рабочего скрипта и всех его зависимостей. Поэтому надёжнее смотреть не только на количество команд, но и на код конкретного метода.

Движок написан на Bash и использует стандартные утилиты вроде awk и md5sum. fzf, playerctl, ripgrep, ffmpeg и другие программы нужны соответствующим методам, а не каждому вызову me.

Прежние оценки времени запуска и размера здесь не привожу: они относились к старому движку с eval и кэшем в /dev/shm и не подтверждают производительность текущей реализации.

Почему это просто инструмент

В me нет:

В движке me есть:

bash -n используется генератором create для проверки нового лаунчера, а не диспетчером при каждом вызове метода.

Всё. Именно поэтому это работает: нет прослойки между тобой и терминалом.

Когда не нужно

me не делает следующего:

Если у тебя 3 алиаса и они работают, me не нужен. Если же ты тратишь время на то, чтобы вспомнить, нагуглить или написать команду, которую используешь ежедневно, me может убрать этот шаг.

Окно терминала: слева - сессия без me (поиск в истории, grep .bashrc), справа - me int (список команд за секунду).

Послесловие

Сейчас я не представляю свою работу без me. Он стал моим вторым языком для терминала. Если ты чувствуешь такую же боль - попробуй.

Это не фреймворк и не попытка заменить оболочку. Просто аккуратная полка для команд, которые иначе жили бы в .bashrc и забывались.

Используемые материалы

Авторские права

Автор: Totiks

Ссылка: https://r4ven.me/software/me-terminal-v-kotorom-uyutno/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
↵
ESC
⌘K Горячая клавиша