Утилита cat входит в базовый набор почти любой системы Linux и за десятилетия стала главным способом заглянуть в файл. Привычка настолько укоренилась, что пределы команды замечают редко: длинный конфигурационный файл превращается в ленту одинаковых строк, нужный фрагмент в журнале на пару тысяч записей приходится искать прокруткой, а перемешанные табуляция с пробелами остаются невидимыми, пока разбор файла не завершится ошибкой. Утилита bat развивает знакомую механику и печатает содержимое файлов с подсветкой синтаксиса, номерами строк, заголовками и отметками git, а длинный вывод сама отправляет в постраничный режим. Ниже установка, настройка и практика, которая превращает bat в ежедневный инструмент администратора.
Чем Bat дополняет классический вывод cat при чтении файлов в терминале
bat принимает те же аргументы, что и cat: имена файлов, стандартный ввод, конкатенацию нескольких источников. Отличия начинаются сразу после нажатия Enter. Вывод сопровождают номера строк, подсветка конструкций языка и заголовок с именем файла, а когда текст не влезает на экран, bat сам открывает постраничный режим less без ручной сборки конвейера. Утилита написана на Rust, распространяется одним бинарным файлом и не тянет за собой громоздких зависимостей, поэтому одинаково работает на рабочей станции и на удалённом сервере через SSH.
Простой пример показывает разницу мгновенно:
bat docker-compose.yml
Файл YAML распознаётся по расширению, ключи и значения окрашиваются, строкам присваиваются номера, а шапка напоминает, что именно открыто. Если передать несколько файлов, bat печатает их подряд, отделяя каждый собственным заголовком, и границы документов больше не сливаются в единый поток:
bat notes.md todo.md
bat принимает текст и из конвейера. Команда git diff печатает изменения без цвета, когда вывод уходит дальше, но bat восстанавливает подсветку, если его собственный выход направлен на терминал:
git diff | bat --language diff
Так различия между версиями и вывод системных утилит получают цвета без настройки сторонних программ. Подсветка опирается на обширный набор описаний синтаксисов, который применяется автоматически: сценарии оболочки, конфигурации YAML и JSON, разметка Markdown и множество языков программирования определяются без подсказок. Там, где автоматика ошибается, язык задают вручную.
Установка Bat в популярных дистрибутивах Linux и особенность имени batcat
В Debian и Ubuntu пакет ставится штатным менеджером, но исполняемый файл называется batcat из-за конфликта имён с другим пакетом:
sudo apt install bat
batcat --version
Чтобы печатать привычное bat, создают символическую ссылку в каталоге из переменной PATH:
mkdir -p ~/.local/bin
ln -s /usr/bin/batcat ~/.local/bin/bat
После перезапуска оболочки команда bat будет доступна в каждой новой сессии.
В Fedora и Arch Linux имя пакета совпадает с названием утилиты, и после установки команда доступна сразу:
sudo dnf install bat
sudo pacman -S bat
Пакет присутствует и в репозиториях openSUSE и Alpine, там применяется zypper или apk. После установки полезно убедиться, что терминал поддерживает расширенную палитру цвета, иначе темы урезаются до базовых оттенков. Современные эмуляторы терминала справляются с этим без настройки, а удалённые сессии SSH передают цвета корректно, когда клиентский терминал настроен верно.
Автоматическая и ручная подсветка синтаксиса для конфигураций и кода
Определение языка идёт по расширению файла. Для файлов без расширения bat заглядывает в первую строку, где объявлен интерпретатор, и включает подсветку соответствующего языка:
bat /usr/local/bin/backup
Сценарий с шебангом #!/usr/bin/env python3 раскрашивается по правилам Python, хотя имя файла не намекает на язык. Полный список поддерживаемых языков печатает ключ --list-languages, он же подсказывает точное имя, которое ожидает --language. Нужный раздел удобно отфильтровать сразу:
bat --list-languages | grep -i sql
Ручное указание языка выручает в трёх типичных ситуациях: у файла нет расширения, расширение нестандартное или содержимое пришло через стандартный ввод:
bat --language json events.txt
ip -j addr | bat --language json
Утилита ip умеет печатать адреса в формате JSON, и bat подсвечивает поля прямо из конвейера. Для нестандартных расширений закрепляют правило сопоставления, тогда файлы с расширением conf подсвечиваются по правилам ini:
bat --map-syntax '*.conf:ini' /etc/supervisor/supervisord.conf
Языки, которых нет в каталоге, не подсвечиваются вовсе, и bat показывает такой файл с номерами строк как обычный текст. Поведение предсказуемо, половинчатых режимов с частично рабочей разметкой у утилиты нет.
Темы оформления и управление стилем вывода от полного до чистого
За палитру отвечает тема, весь перечень вариантов печатает --list-themes. Тему задают на один запуск ключом --theme, через переменную BAT_THEME или навсегда в конфигурационном файле, путь к которому подсказывает --config-file:
--theme="Nord"
--style="numbers,changes,header"
Стиль управляет декорациями независимо от цвета. Компонент numbers добавляет нумерацию, header печатает шапку с именем файла, changes показывает отметки git, grid обрамляет вывод линиями. Ключ --style=full включает всё сразу, короткий -p убирает украшения полностью и оставляет чистый текст с подсветкой, вариант --style=numbers оставляет только нумерацию. Один инструмент закрывает и неспешное изучение конфигурации, и быструю вставку фрагмента в переписку с коллегой. Полный стиль удобен при внимательном чтении: шапка с размером файла и рамка удерживают внимание на границах фрагментов:
bat --style=full ~/.bashrc
Для разовых сравнений тему подбирают переменной на одну команду, чтобы не трогать конфигурацию:
BAT_THEME="Monokai Extended" bat server.py
Тёмные темы рассчитаны на тёмный фон терминала, светлые на светлый, иначе часть оттенков сливается с фоном и подсветка мешает, а не помогает. Переменные BAT_THEME и BAT_STYLE задают тему и стиль по умолчанию для всей оболочки, а BAT_CONFIG_PATH переносит конфигурацию в нестандартное место. Собственные описания синтаксисов и тем подключаются через каталог конфигурации с последующей командой bat cache --build, что пригодится разработчикам с внутренними форматами файлов, которых нет в стандартном наборе.
Диапазоны строк, непечатаемые символы и отметки git рядом со строками файла
Длинный конфигурационный файл редко читают целиком. Ключ --line-range печатает нужный отрезок, а нумерация сохраняет настоящие номера строк файла, а не порядковые номера фрагмента:
bat --line-range 120:160 /etc/ssh/sshd_config
Ключ повторяют в одной команде, чтобы показать несколько разрозненных участков сразу:
bat --line-range 10:40 --line-range 200:230 deploy.py
Ключ --show-all делает видимыми непечатаемые символы: табуляцию, возврат каретки, спецбайты внутри строк. Классическая проверка файла, присланного с машины под Windows, сворачивается в одну команду:
bat --show-all import.csv
Если строки оканчиваются возвратом каретки, это видно сразу, и странные ошибки разбора теряют загадочность. Ширина табуляции регулируется ключом --tabs, что держит столбцы ровными в Makefile, где отступы обязаны быть табуляцией:
bat --tabs 4 Makefile
Диапазоны сочетаются с показом скрытых байтов, поэтому подозрительный участок можно рассмотреть и в раскрытом виде. Если файл лежит внутри рабочей копии git, bat сопоставляет его с последним зафиксированным состоянием и печатает на полях отметки для строк, которые добавлены или изменены. Править файл для этого не нужно, состояние хранилища версий читается автоматически. Свежие правки видны ещё до открытия сравнения версий, и легко понять, какие строки трогали последними.
Чтение логов на сервере и цветной вывод справочников man через переменные окружения
Журналы выигрывают от bat заметнее прочих файлов, хотя подсветка здесь вторична. Главную пользу дают номера строк и постраничный режим: большой журнал листается стрелками, поиск внутри less запускается слэшем, переход к следующему совпадению выполняется клавишей n, выход происходит по q. Пробел перелистывает страницу вперёд, b возвращает назад, g прыгает к началу, G к концу:
bat /var/log/syslog
Для журналов, где события записаны в формате JSON, подсветку включают вручную, и структура каждой записи читается быстрее:
bat --language json /var/log/app/events.log
Поиск по журналу оставляют за grep с ключом -n, а найденный номер строки становится отправной точкой для bat:
grep -n "threshold" app.log
bat --line-range 4870:4890 app.log
У grep и bat номера совпадают, поэтому ссылка на конкретное место в журнале однозначна, коллеге достаточно назвать номер строки. Растущий журнал читают с конца: общая длина известна после wc -l, а диапазон у хвоста выводит свежие события без прокрутки:
wc -l /var/log/app/events.log
bat --line-range 9870:9910 /var/log/app/events.log
Постраничный режим при коротком фрагменте не включается, вывод остаётся на экране. Ключ --paging=always открывает постраничный просмотр принудительно, --paging=never отключает его полностью.
Справочники man тоже раскрашиваются через bat. man форматирует страницы спецпоследовательностями, и bat превращает их в цветной текст, если задать его в переменной MANPAGER:
export MANPAGER="sh -c 'col -bx | bat --language man --plain'"
man sshd_config
Утилита col в цепочке подчищает форматирование man, bat печатает страницу с подсветкой разделов и ключей, а --plain удерживает лишние декорации, чтобы справочник читался привычно, только с цветом.
Границы замены cat в скриптах и конвейерах при переходе на Bat
В интерактивной работе bat можно назначить на привычное имя через алиас, и каждое обращение к cat получает подсветку и номера строк:
# ~/.bashrc
alias cat='bat --paging=never'
Проверить, чем стала привычная команда в текущей оболочке, помогает type cat: bash покажет и алиас, и путь к бинарному файлу.
Удобство не должно ломать автоматизацию. Алиасы в bash не действуют в неинтерактивных сценариях, поэтому скрипты, запускаемые по расписанию или из юнитов systemd, продолжают вызывать оригинальную cat и получают предсказуемый текст без ANSI-кодов и нумерации. Плановые скрипты и автоматические проверки полагаются на точный текст вывода, поэтому внутри конвейеров bat запускают с явно заданным поведением, а не полагаются на умолчания:
#!/bin/sh
# проверка конфигурации перед перезапуском службы
if grep -q "listen 443 ssl" /etc/nginx/nginx.conf; then
echo "ssl section found"
else
echo "ssl section missing" >&2
exit 1
fi
Перед переопределением привычной команды фиксируют правила, при которых замена остаётся безопасной:
- внутри скриптов вызывается оригинальная команда cat без алиасов и обёрток;
- в интерактивной оболочке алиас ведёт на bat с ключом --paging=never, чтобы поведение совпадало с классическим выводом в терминал;
- там, где вывод файла разбирает программа, применяется cat либо bat с ключами --plain и --color=never;
- доступ к исходной команде всегда остаётся через конструкцию command cat.
Если bat оказался в середине конвейера, его запускают с явными ключами: --plain убирает декорации, --color=never отключает ANSI-последовательности, --paging=never исключает постраничный режим:
bat --plain --color=never --paging=never big.json | jq '.hosts[0].ip'
Ключи --plain и --color=never решают разные задачи: первый убирает номера строк и шапку, второй цветовые коды, поэтому чистый текст для анализа получается только при их совместном использовании.
Оригинальная cat остаётся лучшим выбором для машинного потребления, а bat раскрывается там, где файл читает человек. Подсветка ускоряет разбор конфигураций, номера строк дают точные ссылки на фрагменты, постраничный просмотр выручает на больших журналах, отметки git подсказывают, что уже изменено, а цветные справочники man сокращают путь от вопроса до ответа. Разумное разделение труда между двумя командами даёт комфорт в терминале без риска для скриптов и автоматических проверок.