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 の進化版を使うと一気に読みやすくなるよ。cat をもじった名前なんだ。シンタックスハイライト・行番号・Git の差分表示まで、最初から全部ついてくるよ。結論を先に
bat=catの代わりです。色付き・行番号・Git 差分・自動ページング を最初から備えます- Ubuntu / Debian では
sudo apt install batで入ります。ただしコマンド名はbatcatです - パイプやスクリプトでは
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 になります。
sudo apt install bat は成功しました。でも bat config.json と打つと bat: command not found と出ます。インストールに失敗したのでしょうか。batcat になっているだけ。batcat --version と打ってみて。fd の fdfind 問題と同じパターンだよ。シンボリックリンクを張れば bat で呼べるようになる。bat という名前で使いたい場合は、~/.local/bin にシンボリックリンクを張ります。
mkdir -p ~/.local/bin ln -sf "$(which batcat)" ~/.local/bin/bat
-f を付けているのは、すでに同じ名前のリンクがあっても張りなおせるようにするためです。
まず ~/.local/bin が PATH に入っているかをたしかめます。
$ 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 でリンクを張らない場合
リンクが面倒なら、この記事のコマンド例の bat を batcat に読みかえても動きます。ただしリンクを張っておく方が、ほかの記事やドキュメントの 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を使う。
# 行番号・ヘッダー・罫線を消す(色付きのまま) $ 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 とやったら、色の記号が混ざらずに grep の結果が出ました。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 の末尾に次の行を足し、source ~/.bashrc で読みなおします。
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
シンボリックリンクを張っていない Ubuntu / Debian では、上の bat を batcat に書きかえてください。書きかえ忘れると、man を開いたときに何も表示されなくなります。次の fzf の例も同じです。
読み方
col -bx:manの出力に含まれる制御文字を整えます(重ね打ちによる太字など)bat -l man -p:それをman用の言語ルールで色付けし、装飾なし(-p)で表示します- 設定後に
man lsなどを開くと、見出しやオプションが色分けされて読みやすくなります
fzf(あいまい検索)のプレビューに使うと、候補ファイルの中身を色付きで見られます。
# ファイルを選びながら中身を色付きプレビュー
$ fzf --preview 'bat --color=always {}'--color=always を付けているのはなぜですか。fzf のプレビュー窓は、画面ではないと判定されることがある。そのままだと bat が色を外してしまうんだ。だから「いつも色を付けて」と明示している。ふだんのパイプでは付けないのが正解、という使い分けだよ。9. ミニ課題:自分の環境で試してみよう
結論: 表示・装飾オフ・行範囲指定の 3 問で、
batの基本操作を定着させる。
これから使う ~/.bashrc は、見るだけで書きかえません。安心して試してください。
課題 1:~/.bashrc を bat で開き、行番号と色 が付くことを確かめよう。
ヒント 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 は「人が目で見るとき」の道具、と覚えておけば迷わないよ。command not found が出ても、もうあわてません。名前が batcat なだけですね。今日の 3 行まとめ
結論: bat は cat の読みやすい代わりであり、装飾は
-ppで外せる。中身の表示は同じ。
bat ファイル名で、色付き・行番号付きに中身を見られます- Ubuntu で
bat: command not foundが出たら、名前がbatcatになっているだけです - パイプやコピー用途では
-ppを付けます。スクリプトでは素直にcatを使います