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

P.S. なんともふざけたコマンドですね…笑
git-cliff
git cliff
は CHANGELOG 自動生成してくれるコマンドです。

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

jless
jless
はコマンドラインの JSON ビューワーです。
jless storage.json

cat や bat と組み合わせて使うことも可能です。
cat storage.json | jless
bat storage.json | jless
jql
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 を表示してみました。

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

ちなみに、HTTPie CLI は Python で実装されています。
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 ツールがたくさんあると思います…。


コメント