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

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

この記事でできるようになること

  • `bat` で色付き・行番号付きにファイルを表示できる
  • Ubuntu の `batcat` 問題を自分で直せる
  • `-p` と `-pp` で装飾を外し `cat` と同じ出力にできる

前提知識(先に読むと理解しやすい記事)

この記事でわかること

  • cat の代わりに bat を使い、色付き・行番号付きでファイルを表示 できます
  • Ubuntu / Debian の batcat 問題(コマンド名が bat でない)を直せます
  • パイプやスクリプトで使うとき、装飾を消して cat と同じ出力 にできます
  • man ページの色付けなど、毎日きく応用 が身につきます

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

言葉の整理(先に取りちがえを防ぎます)

  • シンタックスハイライト:文法にそって、色を分けて見せることです。「構文の色分け」も同じ意味です。
  • ページャ:長いファイルを 1 画面ずつ見せてくれる道具です。less が代表です。
  • 標準出力:コマンドの結果が出ていく先です。ふだんは画面です。
  • パイプ| のことです。左のコマンドの結果を、右のコマンドに渡します。
  • シンボリックリンク:べつの名前で同じものを指す「近道」です。Windows のショートカットに近いものです。
  • PATHパスファイルやディレクトリの場所を表す文字列。:コマンドを探しに行く場所の一覧です。ここに入っていない場所のコマンドは、名前だけでは呼び出せません。

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

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

結論を先に

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

1. bat とは何か?

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

リナ: そもそも batcat と何が違うのですか。
ライニー先輩: やることは同じ「ファイルの中身を表示する」だよ。違うのは 見やすさ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 になります。

リナ: 先輩、sudo apt install bat は成功しました。でも bat config.json と打つと bat: command not found と出ます。インストールに失敗したのでしょうか。
ライニー先輩: 失敗していないよ。入っている。名前が batcat になっているだけ。batcat --version と打ってみて。
リナ: あっ、動きました。入っていないのではなく、名前が違っただけだったのですね。
ライニー先輩: そう。ここは多くの人が一度つまずくところ。fdfdfind 問題と同じパターンだよ。シンボリックリンクを張れば bat で呼べるようになる。

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

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

-f を付けているのは、すでに同じ名前のリンクがあっても張りなおせるようにするためです。

まず ~/.local/binPATH に入っているかをたしかめます。

$ echo $PATH

出力の中に /home/ユーザー名/.local/bin が見つかれば、この先の追記は要りません。見つからない場合だけ次に進みます。

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

>>> を間違えない

  • >>末尾に足す 記号です。もとの中身は残ります
  • >中身を消して書きかえる 記号です。> を使うと ~/.bashrc の中身がすべて消えます
  • 消えた中身は元に戻せません。ゴミ箱にも残りません
  • この操作はあなたのパソコンの設定ファイルを変えます。bat は本サイトの仮想ターミナル入力したコマンドを解釈してコンピュータに実行させる対話プログラム。では動かないため、実行は自分のパソコンのターミナルで行います
  • 実行前に必ず控えを取ってください
$ cp ~/.bashrc ~/.bashrc.bak
  • 間違えて > を打ってしまったら、cp ~/.bashrc.bak ~/.bashrc で戻せます

source は何をしているか

~/.bashrc は「新しくターミナルを開いたとき」に読まれるファイルです。追記しただけでは、いま開いているターミナルには反映されません。source ~/.bashrc は「今すぐ読みなおして」という指示です。ターミナルを開きなおしても同じ効果になります。

インストールとバージョンを確認します。

$ bat --version
bat 0.24.0

数字は環境によって違います。バージョンが表示されれば、インストールは成功しています。

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

リンクが面倒なら、この記事のコマンド例の batbatcat に読みかえても動きます。ただしリンクを張っておく方が、ほかの記事やドキュメントの bat をそのままコピペできて楽です。

3. bat の基本的な使い方は?

結論: bat ファイル名 で、色付き・行番号付きで中身を表示する。複数ファイルを並べると、見出し付きで区切って表示してくれる。

ライニー先輩: 使い方は cat とまったく同じ。表示したいファイル名を渡すだけだよ。まずは色分けを試すファイルを作ろう。
$ mkdir -p ~/bat-practice
$ cd ~/bat-practice
$ printf '{\n  "name": "penguin",\n  "version": "1.0.0",\n  "debug": false\n}\n' > config.json
$ 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 とやったら、色の記号が混ざらずに grep の結果が出ました。
ライニー先輩: いいところに気づいたね。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 の末尾に次の行を足し、source ~/.bashrc で読みなおします。

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

シンボリックリンクを張っていない Ubuntu / Debian では、上の batbatcat に書きかえてください。書きかえ忘れると、man を開いたときに何も表示されなくなります。次の fzf の例も同じです。

読み方

  • col -bxman の出力に含まれる制御文字を整えます(重ね打ちによる太字など)
  • bat -l man -p:それを man 用の言語ルールで色付けし、装飾なし(-p)で表示します
  • 設定後に man ls などを開くと、見出しやオプションが色分けされて読みやすくなります

fzf(あいまい検索)のプレビューに使うと、候補ファイルの中身を色付きで見られます。

# ファイルを選びながら中身を色付きプレビュー
$ fzf --preview 'bat --color=always {}'
リナ: --color=always を付けているのはなぜですか。
ライニー先輩: fzf のプレビュー窓は、画面ではないと判定されることがある。そのままだと bat が色を外してしまうんだ。だから「いつも色を付けて」と明示している。ふだんのパイプでは付けないのが正解、という使い分けだよ。

9. ミニ課題:自分の環境で試してみよう

結論: 表示・装飾オフ・行範囲指定の 3 問で、bat の基本操作を定着させる。

ライニー先輩: 覚えたことを手になじませるために、自分の環境で次の課題をやってみよう。

これから使う ~/.bashrc は、見るだけで書きかえません。安心して試してください。

課題 1~/.bashrcbat で開き、行番号と色 が付くことを確かめよう。

ヒント 1(方向づけ)を見る

cat と同じ使い方です。見たいファイルの名前を渡すだけで、オプションは要りません。

ヒント 2(コマンド名)を見る

bat ~/.bashrc を実行します。Ubuntu でリンクを張っていない場合は batcat に読みかえます。

答えを見る
$ bat ~/.bashrc

左端に行番号、上部にファイル名のヘッダーが出ます。シェルスクリプトとして色分けされていれば成功です。長い場合はページャが開くので、q で終わります。

課題 2:同じファイルを開き、装飾もページャも消えて cat と同じ見た目 になることを確かめよう。

ヒント 1(方向づけ)を見る

装飾を外すオプションを 2 回重ねます。1 回だと色とページャが残ります。

ヒント 2(コマンド名)を見る

bat -pp ~/.bashrc を実行します。

答えを見る
$ bat -pp ~/.bashrc

行番号・ヘッダー・罫線が消えます。ページャも開かず、一気に出力されます。cat ~/.bashrc とほぼ同じ見た目です(画面では色だけ残ります)。

課題 3~/.bashrc先頭 10 行だけ を表示しよう。

ヒント 1(方向づけ)を見る

行の範囲を指定するオプションがあります。開始:終了 の形で書きます。

ヒント 2(コマンド名)を見る

bat -r を使います。先頭からなら、開始を省略できます。

答えを見る
$ bat -r 1:10 ~/.bashrc

bat -r :10 ~/.bashrc でも同じ結果になります。bat -r 5: ~/.bashrc(5 行目以降)も試すと、範囲指定の感覚がつかめます。

振り返り

結論: 人が目で見るときは bat、スクリプトで渡すときは cat、という使い分けに落ち着く。

リナ: 整理します。まず bat で見る、コピーしたいときは -pp、範囲をしぼるなら -r ですね。
ライニー先輩: いい整理だね。ただ、スクリプトの中では cat を使う。bat は「人が目で見るとき」の道具、と覚えておけば迷わないよ。
リナ: Ubuntu で command not found が出ても、もうあわてません。名前が batcat なだけですね。

今日の 3 行まとめ

結論: bat は cat の読みやすい代わりであり、装飾は -pp で外せる。中身の表示は同じ。

  1. bat ファイル名 で、色付き・行番号付きに中身を見られます
  2. Ubuntu で bat: command not found が出たら、名前が batcat になっているだけです
  3. パイプやコピー用途では -pp を付けます。スクリプトでは素直に cat を使います

次に読む

この記事を共有

次の一手