Rust は CLI ツールの実装というユースケースでも使用されるプログラミング言語の 1 つです!
Meta 社も Programming languages endorsed for server-side use at Meta という記事で、CLI ツールの開発なら Rust がおすすめであると明言しています。
私も Rust で mocks というツール実装して、楽しんでいます!
CLI Tools written in Rust
OSS で公開されている Rust 実装の CLI ツールたちを見ていきましょう!
bat
bat は cat の代替コマンドです。
ファイルをターミナル上でシンタックスハイライトを効かせた状態で表示できて、Git の情報も表示してくれます。

bottom
btm は top の代替コマンドです。
gtop 、gotop、htop にインスパイアされたプロセスやシステムリソースを監視するためのツールです。

delta
Git での差分表示でシンタックスハイライトして見やすくしてくれるツールです。
delta をインストールして、~/.gitconfig の設定を変更することで色々とカスタマイズできます。
[core]
pager = delta
[interactive]
diffFilter = delta --color-only
[delta]
navigate = true
line-numbers = true
side-by-side = true
[merge]
conflictstyle = diff3
[diff]
colorMoved = default変更差分が非常に分かりやすくなります!

dust
dust は du の代替コマンドで、du + rust というところから命名されているようです。
ディレクトリやファイルのサイズを確認することができます。
カレントディレクトリ配下のファイルやディレクトリのサイズ、サブディレクトリのリスト(ツリー)、容量の占有率(バーチャート)を表示することができます!

eza
eza は ls の代替コマンドです。
exa というコマンドがメンテナンスされなくなり、フォークされて開発が進められいます。
ls にはない便利なパラメータがたくさんあります!

fd
fd は find の代替コマンドです。
ファイルやディレクトリの検索ができ、--max-depth で最大の階層数を指定できたり、--type でファイルの種類を指定できたり、シンプルで使いやいかつ高速に動作するコマンドです。


genact
genact は忙しいふりをしてするためのコマンドです。
実際は何も起こっていないのに、何かエキサイティングなことや役に立つことをしているふりができます笑

git-cliff
git cliff は CHANGELOG 自動生成してくれるコマンドです。

git cliff は CHANGELOG.md を生成しません。
ファイルまで生成したい場合は以下のコマンドを実行します。
git cliff -o CHANGELOG.mdgobang
gobang は TUI データベース マネジメント ツールです。
Rust コントリビュータの TaKO8Ki さん が開発されています。

hyperfine
hyperfine はコマンドラインベンチマークツールで、シェルコマンドの実行時間を正確に測定・比較することができます。
複数コマンド比較が可能で、異なるコマンドやプログラムのバージョン間での性能差を一度に測定できます。
また、キャッシュの制御も可能で --warmup オプションでウォームキャッシュでの測定ができたり、--prepare オプションでコールドキャッシュでの測定ができたりします。
hyperfine --warmup 3 'grep -R TODO *' 'rg TODO'
jless
jless はコマンドラインの JSON ビューワーです。
jless storage.json
cat や bat と組み合わせて使うことも可能です。
cat storage.json | jless
bat storage.json | jlessjql
jql は JSON クエリ言語ツールで、「ジャッカル🐺」 と発音します。

HTTPie CLI の https コマンドなどと組み合わせて使うこともできます。
日本の山岳一覧 を取得後、mountains の配列に含まれる山岳データを id が 396 で絞り込んだ結果の 0 番目を出力しています。
https https://mountix.codemountains.org/api/v1/mountains | jql '"mountains"|={"id"=396}[0]'
just
just は、make にインスパイアされたツールです。
プロジェクトの様々なタスクを簡単に管理・実行することができます。
recipe-name:
echo 'This is a recipe!'
# this is a comment
another-recipe:
@echo 'This is another recipe.'
lsd
lsd は ls の代替コマンドで、LSDeluxe の意味です。
色、アイコン、ツリービューなど、より多くの書式設定オプションなどの多くの追加機能が提供されています。

monolith
monolith は Web ページ全体を単一の HTML ファイルとして保存することができるコマンドです。
CSS、画像、JavaScript アセットをすべて一度に埋め込み、保存して共有しやすい単一の HTML5 ドキュメントを生成してくれます。
monolith https://dottrail.codemountains.org/lp/mountix-api/ -o lp-mountix-api.html
procs
procs は ps の代替コマンドです。
色付きで非常に見やすく、検索やツリー表示も可能です!

rip
rip は rm の代替コマンドで、Rm ImProved の R I M を取って命名されています。
削除したファイルを確認でき、ロールバックして復元することもできます。

ripgrep
rg は grep の代替コマンドです。
非常に高速に動作することを売りにしています!
-g で GLOB 形式での対象ファイルの絞り込みができます。
例えば、以下のコマンドはカレントディレクトリ配下の README.* に該当するファイル名の中から foo を Grep 検索しています。
rg foo -g 'README.*'
! を付与することで、対象のディレクトリ除外することもできます。
rg Hello -g '!sub/**/*'
sd
sd は sed の代替コマンドで、Search & Displace の S と D を取って命名されているようです。
文字リテラルや正規表現を使って対象を検索して、置換することができます。
-p, --preview はプレビューモードのオプションで実際に置換はされません。

sshx
sshx はターミナルを誰とでも共有できるコマンドです。
以下のような特徴があります。詳細は sshx.io を確認してみてください!
- 1 つのコマンドを実行するだけで、ターミナルを誰とでも共有できる。
- 無限のキャンバス上での自由なズームとパンが可能。
- 他の人のカーソルの動きをリアルタイムで確認できる。
- グローバルに分散されたメッシュ内の最も近いサーバーに接続される。
- Argon2 と AES によるエンドツーエンドの暗号化される。
チャットでやり取りもでき、とても面白いツールだと思います。

tailspin
tspin はログファイルをシンタックスハイライトしてくれるコマンドです。
tailspin のサンプルログ example1 を表示してみました。

tokei
tokei はコードベースの統計情報を高速に分析するツールです。
ファイル数、ファイル内の行数、コード、コメント、空白を言語ごとにグループ化して表示することができ、プロジェクトの規模や構造を把握するのに役立ちます。
数百万行のコードを数秒でカウント可能なほど高速に動作し、150 以上の幅広いプログラミング言語とその拡張子をサポートしています。

xh
xh は HTTP リクエストを送信するための使いやすく高速なツールです。
It reimplements as much as possible of HTTPie’s excellent design, with a focus on improved performance.
HTTPie CLI の Rust 再実装版のようなツールと言えます。

xsv
xsv は CSV ファイルのインデックス作成、スライス、分析、分割、結合のためのコマンドです。
サンプル CSV をダウンロードして、スライス操作を実行してみました。
curl -LO https://burntsushi.net/stuff/worldcitiespop.csv
zoxide
z と zi は cd の代替コマンドです。
なお zi を利用するには、別途 fzf をインストールする必要があります。
本来 cd /works/mocks-storage/ と入力しないとディレクトリを移動できないケースでも、zoxide を使えば z mocks-storage で移動することができます。
これは zoxide がディレクトリへの移動頻度を記憶してくれているため、mocks-storage を指定するだけで移動できるのです。
また、zi を使うことで記憶されたディレクトリを選択して移動することができます。
「ディレクトリへの移動頻度」はスコアで管理されていて、zi でも確認することができます。

指定したディレクトリ名のマッチングやスコアについては Algrithm を確認してください!
z と zi を使えるようにするには、~/.zshrc に設定が必要です。(zsh の場合)
eval "$(zoxide init zsh)"Rust で CLI ツールを実装するなら Clap
Rust で CLI ツールを実装するなら、Clap がデファクトスタンダードなクレートです。
Clap を使えば、コマンドライン引数を簡単に扱うことができ、--version や --help といったオプション引数の出力をよしなに実装してくれます。
紹介してきたツールでも Clap が使用されているケースがほとんどでした!

まとめ
気になる CLI ツールはありましたでしょうか?
Rust で実装されたツールは総じて 高速 と謳われています。
クロスコンパイルが可能でシングルバイナリにビルドされるため、配布もしやすい点もメリットでしょう。
Clap を使えば CLI ツールの実装は簡単にできるので、ぜひ Rust で CLI ツールを実装してみてください!
なお、今回は Github の星が多いものを中心にピックアップしています!
まだまだ、紹介してきれてない CLI ツールがたくさんあると思います…。


コメント