Продолжаем серию про утилиты, которые переписали классику GNU на Rust. После ls — очередь cat. bat делает то же самое, только красит вывод по языку файла и добавляет рамку с номерами строк и именем файла.

bat nginx.conf

По умолчанию вывод обрамлён заголовком с именем файла, номерами строк и вертикальной линейкой — набор элементов задаётся флагом --style (auto, full, plain, либо через запятую нужные компоненты: header, numbers, grid, changes). Для скриптов, где нужен чистый текст без рамок — bat --style=plain или -p.

Отдельное поле слева — git-статус строки относительно индекса: изменённая, добавленная или удалённая строка помечается своим символом прямо при открытии файла, без запуска git diff. В этом разница с уже описанным delta — тот красит именно вывод git diff, а bat показывает маркеры при обычном просмотре файла, то есть можно открыть изменённый конфиг и сразу увидеть, что в нём трогали, не вызывая diff отдельно.

Длинный вывод bat сам пускает через пейджер (less по умолчанию), в отличие от cat — для tail -f или скриптов это нужно явно отключать:

tail -f /var/log/nginx/error.log | bat --paging=never -l log

Флаг -l тут задаёт язык подсветки вручную, когда имя файла не даёт её определить (как в примере с stdin).

Из практики — многие ставят alias cat="bat", но в скриптах, где вывод cat парсится, это ломает всё за счёт рамок и пейджера по умолчанию: для автоматизации оставляют системный cat, а bat — для интерактивной работы в терминале.

#rust #linux