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