はじめに
第6回では、Linuxの基礎コマンド群「Coreutils」について解説しました。Coreutilsに含まれるlsやcatをはじめ、grep、diff、topといったコマンドは、どの環境にもインストールされている基本中の基本のため、ひと通り使えるようになっておくべきです。
しかし、これらのコマンドは歴史が古く、現代からすると機能的に物足りなかったり、不親切な部分もあります。そこで、こうした基本コマンドを置き換える、より現代的な実装が数多く登場しています。こうした現代的な実装は、おおむね共通して以下のような特徴を持っています。
- 従来のコマンドと比べて高いパフォーマンス
- カラフルな出力やシンタックスハイライトといった視覚的な改善
- より分かりやすいオプションや引数設計
- 現代の開発環境に合わせたGit統合機能
共用サーバーに個人向けツールをインストールするのは好ましくない場合もありますが、WSLのような個人用の環境であれば自由にカスタマイズして使いやすくしていきましょう。本記事では筆者が有用だと考えたいくつかの代替コマンドを紹介し、それぞれUbuntuでのインストール方法と基本的な使い方を解説します。
なお、どのコマンドも非常に多くの機能やオプションがあるため、ここではあくまで代表的な使い方のみに限定して紹介します。より詳しい使い方は、各コマンドのマニュアルを参照してください。
eza
「eza」はlsの代替コマンドで、カラフルな出力、Git統合、ツリー表示などの機能を提供します。もともと「exa」という実装が存在したのですがObsoleteとなり、ezaがその後継となります。
インストール方法
APTでezaパッケージをインストールします。
$ sudo apt install -U -y eza
基本的な使い方
ezaに限らず、今回紹介するコマンドは基本的な使い方や多くのオプションを元のコマンドから踏襲しているため、特に違和感なく使えるのではないでしょうか。ezaの便利な点として--gitオプションの存在があります。このオプションを付けることで、Git上でのファイルの変更状態を表示できます。
# カラフルなファイル一覧表示
$ eza
# 詳細情報を表示
$ eza -l
# 隠しファイルも表示
$ eza -a
# Git情報を表示
$ eza -l --git
# ツリー表示
$ eza --tree
zoxide
「zoxide」はcdの代替コマンドで、アクセス頻度と最新性に基づいて賢いディレクトリ移動を実現します。
インストール方法
APTでzoxideパッケージをインストールします。同時にあいまい検索フィルタのfzfパッケージもインストールしておくと良いでしょう。
$ sudo apt install -U -y zoxide fzf
zoxideを使うには、シェルの設定を追加する必要があります。以下のコマンドを実行してください。
$ echo 'eval "$(zoxide init bash)"' >> ~/.bashrc
$ source ~/.bashrc
基本的な使い方
zoxideでは、zというコマンドでディレクトリ移動を行います。最初は通常のcdコマンドと同じですが、zoxideは一度移動したディレクトリを記憶しているため、次回以降はディレクトリ名の一部分を指定するだけで、履歴からマッチする最もスコアの高い(利用頻度の高い)ディレクトリに移動できます。
# 初回は通常のcdと同じ
$ z ~/work
# 一度訪問したディレクトリは部分的な名前でジャンプ可能(ここではwだけで~/workに移動できる)
$ z w
また、ziコマンドでfzfを利用したインタラクティブなディレクトリ選択が可能になります。
$ zi
ripgrep
「ripgrep」はgrepの代替コマンドです。高速性とデフォルトでの再帰検索が特徴です。
インストール方法
APTでripgrepパッケージをインストールします。
$ sudo apt install -U -y ripgrep
基本的な使い方
ripgrepの使い方はgrepに比べてシンプルです。grepでは検索パターンと対象ファイルの指定が必要でしたが、ripgrepでは対象ファイルは省略できます。デフォルトでカレントディレクトリ以下に再帰検索が行われます。
# カレントディレクトリ以下を再帰検索
$ rg "検索パターン"
# 大文字小文字の違いを無視
$ rg -i "pattern"
# 特定のファイルタイプ(ここではMarkdown)のみ検索
$ rg --type md "function"
# ファイル名のみ表示
$ rg -l "pattern"
# 前後3行も表示
$ rg -A 3 -B 3 "pattern"
# 正規表現を使用(Markdownファイルから見出し行を検索)
$ rg --type md "^#+ "
bat
「bat」はcatの代替コマンドです。キーワードに色を付けるシンタックスハイライトやGit統合といった機能を持っています。
インストール方法
APTでbatパッケージをインストールします。
$ sudo apt install -U -y bat
ちなみにUbuntuでは別のパッケージと競合するため、batではなく「batcat」というコマンドとしてインストールされます。以下のエイリアスを設定し、batとして呼び出せるようにしておくと便利です。
$ echo 'alias bat=batcat' >> ~/.bashrc
$ source ~/.bashrc
基本的な使い方
catと同様に、表示したいファイル名を指定して使用するのが一般的な使い方です。catと異なり、デフォルトでページャを使って表示されます。
# 基本的なファイル表示 (シンタックスハイライト付き)
$ bat file.py
# Gitの変更情報も表示
$ bat --diff file.py
# 複数ファイルを表示
$ bat file1.py file2.py
fd
「fd」はfindの代替コマンドです。シンプルな構文やGit統合が特徴です。
インストール方法
APTでfd-findパッケージをインストールします。
$ sudo apt install -U -y fd-find
なお、fdもbatと同様に別のパッケージとの競合問題があり、「fdfind」コマンドとしてインストールされます。こちらも以下のようにエイリアスを設定しておくと便利です。
$ echo 'alias fd=fdfind' >> ~/.bashrc
$ source ~/.bashrc
基本的な使い方
# 基本的なファイル検索
$ fd ファイル名
# Markdownファイルのみを検索
$ fd -e md
# MarkdownファイルとYAMLファイルを検索
$ fd -e md -e yaml
# ディレクトリのみ検索
$ fd -t d
# ファイルのみ検索
$ fd -t f
# 隠しファイル・ディレクトリも含む
$ fd -H filename
# 見つかったファイルに対して指定したコマンドを実行(ここではMarkdownファイルに対してstatコマンドを実行)
$ fd -e md -x stat {} \;
delta
「delta」はdiffの代替コマンドで、特にGit diffに特化した美しい差分表示を提供します。
インストール方法
APTでgit-deltaパッケージをインストールします。
$ sudo apt install -U -y git-delta
deltaは「diff」コマンドの代わりに使うこともできますが、Gitから呼び出すように設定すると真価を発揮します。gitコマンドが暗黙的にdeltaを使用するようにgitconfigを設定しておきましょう。
$ git config --global pager.diff delta
$ git config --global pager.show delta
$ git config --global pager.log delta
$ git config --global pager.reflog delta
基本的な使い方
# 通常のdiffを美しく表示
$ delta file1.txt file2.txt
# Side by Side表示
$ delta --side-by-side file1.txt file2.txt
# deltaを使用してGitの差分を表示
$ git diff
$ git show
$ git log -p
dust
「dust」はduの代替コマンドです。視覚的で分かりやすいディスク使用量表示を提供します。
インストール方法
Snapでdustパッケージをインストールします。
$ sudo snap install dust
基本的な使い方
システムを長期間運用しているとストレージの空き容量が逼迫してくるものの、「具体的にどのディレクトリが容量を食っているのか分からない」といった事態が起こりがちです。従来のduコマンドではdu -hs *といったコマンドを繰り返し実行し、肥大化したディレクトリを掘って対象を突き止める必要ありました。dustコマンドであればディレクトリ階層を辿りながら分析し、肥大化したディレクトリを簡単に突き止めることができます。
# カレントディレクトリ以下のディスク使用量を表示
$ dust
# 特定のディレクトリを分析
$ dust /path/to/directory
# 表示する項目数を制限
$ dust -n 10
# 特定の深度まで表示
dust -d 3
# ディレクトリのみ表示
$ dust -D
procs
「procs」はpsの代替コマンドです。プロセス情報をカラフルに、かつ追加情報とともに出力します。
インストール方法
Snapでprocsパッケージをインストールします。
$ sudo snap install procs
基本的な使い方
procsコマンドを実行すると現在実行中のプロセスリストが表示がされます。また、前述のbatコマンドと同様にprocsもデフォルトでページャを使って結果を表示します。
# 基本的なプロセス一覧を表示
$ procs
# 特定の名前を持つプロセスを表示
$ procs python
# プロセスIDを指定して表示
$ procs 1234
# プロセスをツリー表示
$ procs --tree
# CPU使用率でソート
$ procs --sortd cpu
# ウォッチモード(リアルタイム更新)
$ procs -w
bottom
「bottom」はtopの代替コマンドで、より見やすく使いやすいシステムモニターを提供します。
インストール方法
Snapでbottomパッケージをインストールします。
$ sudo snap install bottom
基本的な使い方
# システムモニターを起動
$ bottom
# グラフを表示しない簡易モード
$ bottom --basic
# 更新間隔を設定
$ bottom -r 1s
bottomはtopと同様に画面全体を占有し、対話的に操作するコマンドです。主な操作は以下の通りです。より詳しくは?キーで表示されるヘルプを参照してください。
| キー | 機能 |
|---|---|
| j or k | プロセスの選択 |
| dd | シグナルの送信 |
| f | 更新の停止/再開 |
| e | ウィジェットの最大化/元に戻す |
| c | プロセスをCPU使用率でソート |
| m | プロセスをメモリ使用率でソート |
| p | プロセスをプロセスIDでソート |
| / | 検索 |
| ? | ヘルプの表示 |
| q | 終了 |
hyperfine
「hyperfine」はtimeの代替コマンドです。コマンドのパフォーマンスを計測できるベンチマークツールで、指定したコマンドを複数回実行し、平均実行時間をはじめとする統計情報を詳細に表示します。
インストール方法
APTでhyperfineパッケージをインストールします。
$ sudo apt install -U -y hyperfine
基本的な使い方
hyperfineの引数に実行したコマンドを指定します。デフォルトでは指定したコマンドを10回実行します。
# 基本的なベンチマーク
$ hyperfine 'dd if=/dev/urandom of=test.img bs=1M count=1024'
# 回数を指定して実行
$ hyperfine --runs 3 'command'
# 結果をJSONで出力
hyperfine --export-json results.json 'command'
# 結果をCSVで出力
hyperfine --export-csv results.csv 'command'
# 結果をMarkdownで出力
hyperfine --export-markdown results.md 'command'
hexyl
「hexyl」はhexdumpの代替コマンドです。バイナリダンプをカラフルで見やすく表示できます。
インストール方法
APTでhexylパッケージをインストールします。
$ sudo apt install -U -y hexyl
基本的な使い方
引数に指定したファイルの内容を16進数にダンプして表示します。例えば、テキストファイルのはずなのに一部が化けて正しく表示されないファイルなどに遭遇することはよくありますが、こうした「テキストとして表示できない文字」でも、バイナリにダンプすることでどのようなデータが書き込まれているかを調べられます。
他にもバイナリファイルのヘッダをチェックする、キャプチャしたパケットを解析するなど、様々な応用が可能なコマンドです。
# 基本的なファイルダンプ
$ hexyl file.bin
# 最初の10バイトのみ表示
$ hexyl -n 10 file
# 最初の10バイトをスキップして、次の10バイトのみ表示
$ hexyl -n 10 -s 10 file
lnav
「lnav」はログファイルの表示と分析に特化したテキストビューアです。ログファイルは従来ならばcatやlessといったシンプルなコマンドで表示したりgrepを組み合わせるくらいしかできず、中身の解析はエンジニアの目に頼らざるを得ない部分がありましたが、lnavを使うとより効率的にログの監視や分析が可能になります。例えば、SQLクエリを発行してログデータを直接フィルタするといったことも可能です。
インストール方法
APTでlnavパッケージをインストールします。
$ sudo apt install -U -y lnav
基本的な使い方
lnavコマンドを引数なしで実行するとsyslogファイルを開きます。このあたりがcat/batコマンドなどとは異なり、特化したログビューアであることの証左だと言えるでしょう。複数のログファイルを同時に表示したり、ディレクトリ内のすべてのログをまとめて開くこともできます。特別なオプションを付けなくても、ログが更新されると自動的に更新部分を読み込みます。
また、ログファイルを開くだけでなく、Dockerのログなどをパイプして読み込ませることも可能です。
# syslogファイルの表示
$ lnav
# 基本的なログファイル表示
$ lnav /var/log/auth.log
# 複数のログファイルを同時に表示
$ lnav /var/log/apache2/*.log
# ディレクトリを再帰的にたどってすべてのログファイルを表示
$ lnav -r /var/log/
# DockerのPodのログを表示
$ docker logs pod | lnav
lnavもまた、対話的に操作するタイプのコマンドです。主な操作は以下のようになっています。より詳しくはヘルプを参照してください。
| キー | 機能 |
|---|---|
| / | 検索 |
| ; | SQL入力モード |
| j/k | 下/上に移動 |
| n/N | 次/前の検索結果にジャンプ |
| e/E | 次/前のエラーへジャンプ |
| w/W | 次/前の警告へジャンプ |
| ? | ヘルプの表示 |
| q | 終了 |
おわりに
本記事では、従来のLinuxコマンドの現代的な代替を紹介しました。これらのコマンドを導入することで、日々のコマンドライン作業がより快適になることでしょう。
筆者は、どのような環境でも作業できるように標準コマンドに習熟することと、効率を追求したカスタマイズを行うことは、どちらも同じくらい大切だと考えています。もちろんいきなりすべてのコマンドを置き換える必要はありません。従来のコマンドと併用しながら、まずはbatやezaのような、視覚的な改善が分かりやすいものから始めてみてはいかがでしょうか。
これらのコマンドを活用して、より生産的な開発環境を構築していきましょう。
- この記事のキーワード