bat 入門 - シンタックスハイライト付きの cat 代替

bat 入門 - シンタックスハイライト付きの cat 代替

この記事でわかること

  • cat の代わりに bat を使って 色付き・行番号付きでファイルを表示 できる
  • Ubuntu/Debian 特有の batcat 問題(コマンド名が bat でない)を解決できる
  • スクリプトやパイプで使うときに 装飾を消して cat と同じ出力 にする方法が分かる
  • man ページの色付けなど 実務で効く応用 が身につく

対象読者:Linux 入門者、cat の素っ気ない出力に物足りなさを感じている方

導入:リナの「cat が読みにくい」問題

リナ: ライニー先輩、設定ファイルを cat config.json で開いたんですけど、全部同じ色で、どこが何だか目が滑っちゃって...。エディタで開き直すのも面倒だし。
ライニー先輩: あー、cat は「中身をそのまま吐き出す」だけだからね。色も行番号も付かない。それ、bat っていう cat の進化版を使うと一発で読みやすくなるよ。
リナ: バット? コウモリですか?
ライニー先輩: 綴りは bat だけど「バット」でいいよ。cat をもじった名前なんだ。シンタックスハイライト(構文の色分け)・行番号・Git の差分表示まで、最初から全部付いてくる。今日はこれを一緒に覚えよう。

結論を先に

  • bat = cat の代替。色付き・行番号・Git 差分・自動ページング を最初から備える
  • Ubuntu/Debian では sudo apt install bat で入るが、コマンド名は batcatbat に揃えるのが定番)
  • スクリプトやパイプで使うときは bat -p(装飾なし)/ bat -pp(ページャも無効)で cat と同じ感覚に戻せる

1. bat とは何か?

結論: batcat の代替コマンド。中身を表示する点は同じだが、シンタックスハイライト・行番号・Git 差分マーカー・自動ページングが付く。

リナ: そもそも bat って cat と何が違うんですか?
ライニー先輩: やることは同じ「ファイルの中身を表示する」だよ。違うのは 見やすさcat が白黒のテキストをそのまま流すのに対して、bat は構文を色分けして、行番号を振って、Git 管理下なら変更行に印まで付けてくれる。
リナ: 至れり尽くせりですね。それって cat の置き換えになるんですか?
ライニー先輩: 日常の「ちょっと中身を見たい」はほぼ bat で済む。ただし完全な互換ではないから、スクリプトやパイプでは少し気をつける点がある。それは後半で説明するよ。

batsharkdp/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 で動かないのは悲しいです...。
ライニー先輩: 大丈夫、fdfdfind 問題と同じパターンで、シンボリックリンクを張れば bat で呼べるようになるよ。

bat という名前で使いたい場合は、~/.local/bin にシンボリックリンクを張る。

mkdir -p ~/.local/bin
ln -s "$(which batcat)" ~/.local/bin/bat

~/.local/binPATH に含まれていない場合は、~/.bashrc に追記して再読み込みする。

echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

インストールとバージョンの確認。

$ bat --version
bat 0.24.0

Ubuntu でリンクを張らない場合

リンクが面倒なら、この記事のコマンド例の batbatcat に読み替えても動く。ただしリンクを張っておく方が、ほかの記事やドキュメントの 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 を使う。

リナ: 色や行番号は嬉しいんですけど、中身をそのままコピーしたいときに罫線や行番号が邪魔になることがあって...。
ライニー先輩: いい気づき。そういうときは 装飾を外す オプションがある。用途に応じて 2 段階あるよ。
# 行番号・ヘッダー・罫線を消す(色付きのまま)
$ 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 で行範囲を指定できる。tailsed を使わなくても、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出力先が端末(画面)かどうか を見ていて、パイプやファイルにリダイレクトするときは自動で装飾と色を外すんだ。だから grepwc に渡しても壊れない。
# パイプに渡すと自動で素のテキストになる
$ 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. 実務で効く応用は?

結論: batman ページの色付けや、fzf などのプレビュー表示にも使える。「色付きで中身を見せる」場面ならどこでも差し込める。

ライニー先輩: せっかくなので、bat を単体で使う以外の活用も紹介しておくね。一度設定すると地味に効くやつ。

man ページを bat で色付けするには、環境変数 MANPAGER を設定する。~/.bashrc に次の行を足す。

export MANPAGER="sh -c 'col -bx | bat -l man -p'"

読み方

  • col -bxman の出力に含まれる制御文字(重ね打ちによる太字など)を整理する
  • 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 と同じ見た目 になることを確認する

課題 3bat -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 行)も試すと、範囲指定の感覚がつかめる。

次に読む