bat で cat を卒業する — シンタックスハイライト付きで日常を快適にする実践Tips
夜中の2時、Raspberry Pi 5 で動かしている自動売買システムが妙な挙動をしていて、journalctl のログを延々と追いかけていた。標準出力に流れる白黒の文字列。エラーレベルもタイムスタンプも全部同じ色。目が滑る。
そのとき、ふと思い出した。bat をインストールしたまま、結局 cat ばかり使っていたことを。
パイプを | bat -l log に変えただけで、世界が変わった。タイムスタンプが薄いグレー、ERROR が赤、INFO が青。視線が自然と異常箇所に吸い寄せられる。「これ、なんで今まで使ってなかったんだ」と本気で思った瞬間だった。
それ以来、cat はほぼ使っていない。半年使い込んだ感想と、効いた設定をまとめておく。
bat とは何か——cat の上位互換、と言い切っていい
bat は Rust 製の cat 代替ツール。シンタックスハイライト、git 差分マーカー、行番号、ページャー連携が最初から付いている。リポジトリは github.com/sharkdp/bat。
名前の由来は「cat + bat(コウモリ)」らしい。地味なジョークだが、覚えやすくはある。
同じ作者は fd(find 代替) や hyperfine(ベンチマーク)も作っている、いわゆる「モダン Unix ツール」群の一員。ripgrep の実践Tips や zoxide のススメ でも触れたが、この系統のツールは「既存コマンドの完全な代替を狙う」のが共通点で、互換性が高い。bat もファイル指定なしで標準入力を読むし、--paging=never なら cat と同じ感覚で使える。
インストール
Linux/macOS
# Debian/Ubuntu
sudo apt install bat
# macOS
brew install bat
# Arch
sudo pacman -S bat
注意点が一つ。Debian/Ubuntu の apt 版は batcat という名前でインストールされる。bat という別パッケージが既に存在するためだ。エイリアスを切るか、シンボリックリンクを張る。
mkdir -p ~/.local/bin
ln -s /usr/bin/batcat ~/.local/bin/bat
自分は Raspberry Pi 5 (Ubuntu 24.04) でこれをやっている。~/.local/bin が PATH に通っていれば、これで bat として叩けるようになる。
cargo / バイナリ直接
# cargo を入れているなら
cargo install bat
# GitHub Releases から直接
curl -L https://github.com/sharkdp/bat/releases/download/v0.24.0/bat-v0.24.0-aarch64-unknown-linux-gnu.tar.gz | tar xz
ARM64 (Raspberry Pi) 用のビルド済みバイナリも配布されている。Pi で cargo install をすると数分単位で待つことになるので、バイナリを落とす方が早い。
日常で本当に効く 5 つの使い方
1. ソースコードをサッと眺める
bat src/main.py
これだけ。Python なら Python、Rust なら Rust のシンタックスハイライトが効く。行番号も付く。ファイル名がヘッダー表示されるので、複数ファイルを見るときも迷わない。
大量のファイルを連結したい時だけ、cat 互換モードに落とす。
bat -p *.log # ヘッダーも罫線もなしで連結
bat --paging=never file.txt # less 経由をやめる
2. git diff を bat で読む
これがたぶん一番恩恵がデカい。
# pager を bat に切り替える
git config --global core.pager 'bat --paging=always --plain'
# diff だけは delta を使う構成も多いが、bat 単体でも十分実用
ただ、git diff 専用のハイライトを期待するなら delta の方が綺麗。bat は汎用ビューアなので、diff の追加行(+)と削除行(-)を別色で塗ったりはしない。自分は git log や git show を bat、git diff を delta という分け方にしている。
3. journalctl にパイプして読む
冒頭に書いた使い方。これは本当に視認性が変わる。
journalctl --user -u myservice -n 200 | bat -l log -p
-l log でシンタックスを log として強制指定。-p はプレーン表示(ヘッダーなし、ページャーなし)。systemd のログを追いかけるとき、ERROR と WARN が色分けされるだけで、目で異常箇所を拾える速度がまるで違う。
journalctl の実践ガイド でも書いたが、systemd 運用ではログを読む時間が長くなる。1日の作業で何回も使うコマンドだから、ここに小さい改善を入れるとリターンが大きい。
4. fzf のプレビュー枠に使う
fzf の実践Tips を読んでくれた人には説明不要だと思うが、プレビュー機能の表示部分を bat に差し替えるのが定番。
fzf --preview 'bat --color=always --style=numbers --line-range=:200 {}'
キモは --color=always。fzf はターミナルではないので、bat の自動色判定だと色が消える。明示的に強制する。--line-range=:200 で先頭200行だけにすると巨大ファイルでも軽い。
これを入れた日から、ファイル選択 UX が一段上がった。あるディレクトリを fzf で漁って、Tab キー感覚でプレビューが流れていく感覚は、一度味わうと戻れない。
5. --help や man をハイライトする
# コマンドの help を bat に流す
ls --help | bat -l help
# man ページのハイライトに使う
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
man ページの MANPAGER 設定は半信半疑で入れたが、これも効いた。NAME / SYNOPSIS / DESCRIPTION の見出しが色付きで強調されて、長い man を読むときに「今どのセクションを見てるか」が一瞬で分かる。
カスタマイズで生産性を上げる
テーマの選定
デフォルトテーマは悪くないが、好みで変えられる。
# 利用可能なテーマ一覧
bat --list-themes
# サンプル付きで全部見たい
bat --list-themes --color=always | bat
自分は TwoDark を使っている。コントラストが強めで、Raspberry Pi のターミナル(SSH 越しにフォントが小さくなりがち)でも読みやすい。~/.config/bat/config に書いておけば永続化できる。
# ~/.config/bat/config
--theme="TwoDark"
--style="numbers,changes,header"
--paging=auto
--style で表示要素を制御できる。自分は git 変更マーカーを残したい派なので changes を入れている。シンプル派は --style=plain で全部消すのもアリ。
ページャーの挙動を制御
デフォルトでは出力が画面に収まらないとき、自動で less に流される。これが煩わしいケースもある。
# 常にページャーを使わない
alias cat='bat --paging=never'
# bat を呼ぶ時だけ env 変数で
BAT_PAGER="" bat large_file.json
ちなみに自分は cat をエイリアスで bat に潰すのは推奨していない。シェルスクリプトで cat を呼んだ時に挙動が変わると地雷になる。新しいコマンド名のまま使う のが結局安全だ。
注意点・ハマりどころ
巨大ファイルでは重い
シンタックスハイライトの計算コストがあるので、数百MB のログファイルを bat で開くと体感で遅くなる。grep で絞ってから流す、または --plain で機能オフにする運用がいい。
# 重いログは絞ってから
grep ERROR huge.log | bat -l log
# ハイライトを切る
bat --plain huge.log
SSH 越しの色化け
VPS にログインして bat を叩いたら、色がおかしい。これは TERM 環境変数の問題で、tmux/screen 経由だと screen-256color になっていることが多い。
# .bashrc などに
export TERM=xterm-256color
特にリモートサーバを契約してデプロイ作業をしているなら、この設定はやっておいた方がいい。自分は お名前.comの高性能VPS
でアプリを動かしていて、SSH した直後に色が荒れるたびに「ああ TERM ね」と思い出す。一度 .bashrc に書けば二度と悩まなくていい。
パイプ時の色強制
パイプに流すと bat は自動で色を切る。cat 互換のため、これは正しい挙動。色を強制したいときは明示する。
bat file.py | head -50 # 色なし(自動判定)
bat --color=always file.py | head -50 # 色あり強制
言語の自動判定が外れる
拡張子のないファイル(Dockerfile, Makefile等)はだいたい大丈夫だが、独自フォーマットのログだと素のテキスト扱いになる。-l で明示するクセを付けておくと事故が減る。
まとめ的な話
正直、bat は派手な機能はない。cat に色を付けただけ、と言ってしまえばそれまで。でも、1日に何十回も叩くコマンドの視認性が上がるというのは、効いてくる。地味だが、ボディブローのように効く。
導入コストはほぼゼロ。aptで一発、設定ファイルも10行未満。それで journalctl・git・fzf 連携まで全部底上げされる。費用対効果という点で、ここ最近で一番良かったツールかもしれない。
ここから先のステップとしては、delta(git diff 専用)、fd(find 代替)、eza(ls 代替)あたりへの拡張が定番ルート。順番に導入していくと、ターミナルの体験がじわじわ気持ちよくなっていく。試行錯誤しながら自分の ~/.config/bat/config を育てていくのも、それはそれで楽しい。