TechQuant Blog

bat で cat を卒業する — シンタックスハイライト付きで日常を快適にする実践Tips

7分で読める

夜中の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 の実践Tipszoxide のススメ でも触れたが、この系統のツールは「既存コマンドの完全な代替を狙う」のが共通点で、互換性が高い。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 loggit showbatgit diffdelta という分け方にしている。

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 を育てていくのも、それはそれで楽しい。