bat 入門 - シンタックスハイライト付きの cat 代替
この記事でわかること
catの代わりにbatを使って 色付き・行番号付きでファイルを表示 できる- Ubuntu/Debian 特有の
batcat問題(コマンド名がbatでない)を解決できる - スクリプトやパイプで使うときに 装飾を消して
catと同じ出力 にする方法が分かる manページの色付けなど 実務で効く応用 が身につく
対象読者:Linux 入門者、cat の素っ気ない出力に物足りなさを感じている方
導入:リナの「cat が読みにくい」問題
cat config.json で開いたんですけど、全部同じ色で、どこが何だか目が滑っちゃって...。エディタで開き直すのも面倒だし。cat は「中身をそのまま吐き出す」だけだからね。色も行番号も付かない。それ、bat っていう cat の進化版を使うと一発で読みやすくなるよ。cat をもじった名前なんだ。シンタックスハイライト(構文の色分け)・行番号・Git の差分表示まで、最初から全部付いてくる。今日はこれを一緒に覚えよう。結論を先に
bat=catの代替。色付き・行番号・Git 差分・自動ページング を最初から備える- Ubuntu/Debian では
sudo apt install batで入るが、コマンド名はbatcat(batに揃えるのが定番) - スクリプトやパイプで使うときは
bat -p(装飾なし)/bat -pp(ページャも無効)でcatと同じ感覚に戻せる
1. bat とは何か?
結論:
batはcatの代替コマンド。中身を表示する点は同じだが、シンタックスハイライト・行番号・Git 差分マーカー・自動ページングが付く。
bat って cat と何が違うんですか?cat が白黒のテキストをそのまま流すのに対して、bat は構文を色分けして、行番号を振って、Git 管理下なら変更行に印まで付けてくれる。cat の置き換えになるんですか?bat で済む。ただし完全な互換ではないから、スクリプトやパイプでは少し気をつける点がある。それは後半で説明するよ。bat は sharkdp/bat が開発する Rust 製のツール。cat との主な違いは次のとおり。
| 観点 | cat | bat |
|---|---|---|
| 構文の色分け | なし | あり(言語を自動判別) |
| 行番号 | -n で付く |
デフォルトで付く |
| Git 差分表示 | なし | あり(変更行に印) |
| 長いファイル | 一気に流れる | 自動で less(ページャ)起動 |
| 不可視文字の表示 | -A で記号化 |
-A で記号化 |
| パイプ時の挙動 | 常に素のテキスト | 自動で装飾オフ(後述) |
2. インストールと batcat 問題
結論: Ubuntu/Debian では
apt install batで入るが、名前衝突を避けるためコマンド名がbatcatになる。シンボリックリンクでbatに揃えるのが定番。
# Ubuntu / Debian 系 $ sudo apt install bat # Fedora / RHEL 系 $ sudo dnf install bat # Arch Linux $ sudo pacman -S bat # macOS (Homebrew) $ brew install bat
Ubuntu/Debian の罠:コマンド名が batcat
Debian では別パッケージとのバイナリ名衝突を避けるため、コマンド名が bat ではなく batcat になっている。bat と打つと command not found になる。
bat で動かないのは悲しいです...。fd の fdfind 問題と同じパターンで、シンボリックリンクを張れば bat で呼べるようになるよ。bat という名前で使いたい場合は、~/.local/bin にシンボリックリンクを張る。
mkdir -p ~/.local/bin ln -s "$(which batcat)" ~/.local/bin/bat
~/.local/bin が PATH に含まれていない場合は、~/.bashrc に追記して再読み込みする。
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc source ~/.bashrc
インストールとバージョンの確認。
$ bat --version
bat 0.24.0
Ubuntu でリンクを張らない場合
リンクが面倒なら、この記事のコマンド例の bat を batcat に読み替えても動く。ただしリンクを張っておく方が、ほかの記事やドキュメントの bat をそのままコピペできて楽。
3. bat の基本的な使い方は?
結論:
bat ファイル名で、色付き・行番号付きで中身を表示する。複数ファイルを並べると、見出し付きで区切って表示してくれる。
cat とまったく同じ。表示したいファイル名を渡すだけだよ。$ bat config.json
───────┬────────────────────────────────────────
│ File: config.json
───────┼────────────────────────────────────────
1 │ {
2 │ "name": "penguin",
3 │ "version": "1.0.0",
4 │ "debug": false
5 │ }
───────┴────────────────────────────────────────
画面の読み方
- 左端の数字:行番号(
cat -n相当が標準で付く) - 上部の
File: config.json:表示中のファイル名の ヘッダー - 中身の色:拡張子から 言語を自動判別 して構文を色分け(上は JSON)
複数ファイルを渡すと、それぞれにヘッダーが付いて区切られる。
$ bat a.txt b.txt
cat a.txt b.txt だと中身がくっついて、どこからが b.txt か分からなくなってたんですよね。bat ならファイルごとに見出しが入るから、複数ファイルの確認がぐっと楽になる。長いファイルは自動でページャになる
画面に収まらない長いファイルを bat で開くと、自動的に less(ページャ)が起動する。矢印キーや Space でスクロールし、q で終了する。cat のように画面を一気に流れて見失うことがない。
4. cat のように装飾を消すには?
結論: 装飾(行番号・ヘッダー・罫線)を消すには
-p(--plain)。ページャも止めて完全にcatと同じ出力にするには-ppを使う。
# 行番号・ヘッダー・罫線を消す(色付きのまま) $ bat -p config.json # 装飾もページャも両方消す(ほぼ cat と同じ挙動) $ bat -pp config.json
装飾オフの 2 段階
| オプション | 消えるもの | 残るもの |
|---|---|---|
-p |
行番号・ヘッダー・罫線 | 色付け・自動ページング |
-pp |
上記すべて + 自動ページング | 色付け(端末出力時) |
-p を 2 回で -pp なんですね。覚えやすい。-pp は「装飾なし・ページャなし」だから、cat の代わりにそのまま差し替えやすい。中身だけサッと確認したいときの定番だよ。不可視文字(タブ・改行コード・末尾の空白)を確認したいときは -A(--show-all)。
$ bat -A messy.txt
-A はタブを ├──▶、改行を ␊ のような記号で可視化する。「見えない空白でスクリプトが動かない」系のトラブル調査に効く。cat -A と同じ用途だが、色が付く分わかりやすい。
5. 表示をカスタマイズするには?
結論: 表示する部品は
--style(numbers / header / grid / changes など)で選び、配色は--themeで変える。テーマ一覧は--list-themesで確認できる。
--style で表示する部品をカンマ区切りで指定するんだ。# 行番号だけ表示(罫線・ヘッダーなし) $ bat --style=numbers config.json # 行番号と Git 変更マーカーだけ $ bat --style=numbers,changes config.json # すべての装飾を消す(-p と同じ) $ bat --style=plain config.json
--style で指定できる主な部品
| 値 | 意味 |
|---|---|
numbers |
行番号 |
header |
ファイル名ヘッダー |
grid |
区切りの罫線 |
changes |
Git の変更マーカー |
full |
全部入り(デフォルト相当) |
plain |
全部なし(-p 相当) |
配色テーマは --theme で変更する。利用できるテーマは --list-themes で一覧表示できる。
# テーマ一覧を見る $ bat --list-themes # テーマを指定して表示 $ bat --theme=ansi config.json
設定を恒久化する
毎回オプションを打つのが面倒なら、設定ファイルにデフォルトを書ける。bat --generate-config-file で雛形を作り、--theme や --style の既定値を書いておくと、以降は素の bat だけでその設定が効く。
6. 特定の行だけ見る・強調するには?
結論: 行範囲は
-r(--line-range)で開始:終了を指定する。特定行を目立たせたいときは-H(--highlight-line)。言語を手動指定したいときは-l(--language)。
-r で行範囲を指定できる。tail や sed を使わなくても、bat だけで切り出せるよ。# 100 行目から 120 行目までを表示 $ bat -r 100:120 app.log # 50 行目以降を最後まで $ bat -r 50: app.log # 先頭から 30 行目まで $ bat -r :30 app.log
特定の行を色で目立たせたいときは -H。
# 42 行目をハイライトしながら全体を表示 $ bat -H 42 app.log
拡張子のないファイルなどで言語が自動判別されないときは、-l で明示する。
# 拡張子なしのファイルを JSON として色付け $ bat -l json mydata
bat は拡張子や中身から言語を推測するけど、外れることもある。そのときは -l で「これは JSON だよ」と教えてあげればいい。対応言語の一覧は bat --list-languages で見られるよ。7. パイプやスクリプトで使うときの注意は?
結論:
batは出力先がパイプやファイルのときは自動で装飾を外し、素のテキストを流す。それでもcatの完全な代替ではないので、スクリプトではcatを使うのが無難。
bat config.json | grep debug ってやったら、ちゃんと普通に動きました。色のコードが混ざったりしないんですね。bat は 出力先が端末(画面)かどうか を見ていて、パイプやファイルにリダイレクトするときは自動で装飾と色を外すんだ。だから grep や wc に渡しても壊れない。# パイプに渡すと自動で素のテキストになる $ bat config.json | grep debug # ファイルにリダイレクトしても色コードは入らない $ bat config.json > copy.json
スクリプトでは cat を使う
bat は便利だが、すべての環境に入っているわけではない。シェルスクリプトの中で bat を前提にすると、bat が無いマシンで動かなくなる。配布・共有するスクリプトでは、装飾の要らない処理は素直に cat を使うこと。bat はあくまで「人間が目で見るとき」の道具と割り切るのが安全。
alias cat=bat にして cat を完全に置き換えちゃうのはどうですか?cat の素の挙動を前提にしていることがあるから、エイリアスで上書きすると思わぬ事故になる。使うなら alias bat='batcat' みたいに 別名で足す 方向がいいよ。8. 実務で効く応用は?
結論:
batはmanページの色付けや、fzfなどのプレビュー表示にも使える。「色付きで中身を見せる」場面ならどこでも差し込める。
bat を単体で使う以外の活用も紹介しておくね。一度設定すると地味に効くやつ。man ページを bat で色付けするには、環境変数 MANPAGER を設定する。~/.bashrc に次の行を足す。
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
読み方
col -bx:manの出力に含まれる制御文字(重ね打ちによる太字など)を整理するbat -l man -p:それをman用の言語ルールで色付けし、装飾なし(-p)で表示する- 設定後に
man lsなどを開くと、見出しやオプションが色分けされて読みやすくなる
fzf(あいまい検索)のプレビューに使うと、候補ファイルの中身を色付きで確認できる。
# ファイルを選びながら中身を色付きプレビュー
$ fzf --preview 'bat --color=always {}'--color=always を付けてるのはなぜですか?fzf のプレビュー窓は端末じゃないと判定されることがあって、放っておくと bat が色を外しちゃうんだ。だから「常に色を付けて」と明示してる。逆に普段のパイプでは付けないのが正解、という使い分けだよ。9. ミニ課題:自分の環境で試してみよう
結論: 表示・装飾オフ・行範囲指定の 3 問で、
batの基本操作を定着させる。
課題 1:適当な設定ファイル(例 ~/.bashrc)を bat で開き、行番号と色 が付くことを確認する
課題 2:同じファイルを bat -pp で開き、装飾もページャも消えて cat と同じ見た目 になることを確認する
課題 3:bat -r 1:10 ~/.bashrc で、先頭 10 行だけ が表示されることを確認する
課題 1 のヒント
bat ~/.bashrc
左端に行番号、上部にファイル名ヘッダーが出て、シェルスクリプトとして色分けされていれば成功。
課題 2 のヒント
bat -pp ~/.bashrc
行番号・ヘッダー・罫線が消え、ページャも起動せず一気に出力される。cat ~/.bashrc とほぼ同じ見た目になる(端末では色だけ残る)。
課題 3 のヒント
bat -r 1:10 ~/.bashrc
開始:終了 の形式。bat -r 5: file(5 行目以降)や bat -r :5 file(先頭 5 行)も試すと、範囲指定の感覚がつかめる。