Rustで書かれたコマンド、モダンな感じがしていいですよね。lsの代替としてよく使われるexaやlessのようなページャー機能やシンタックスハイライトを付与してソースコードを出力してくれる機能を併せ持つbatなどRust製の便利なコマンドはたくさんあります。僕も昔は使っていたのですが、最近はカラフルな出力よりも標準コマンドのシンプルな出力の方が好みで使わなくなってしまいました。また、業務でSSH先のサーバで作業することも増えたため、ローカルとリモートで差異をなくしたくなったというのもあります。

しかし、Rustで書かれたコマンドは使いたい(特に理由はない。強いて言えば「カッコいいから」)とは思っていました。そんなときにcoreutilsをRustで再実装されているuutils/coreutilsというものを見つけ、「これだ!」と思い立って、ローカル環境のcoreutilsはuutilsで置き換えてみることにしました。

cargoを使ってインストールするのが一番簡単です。

$ cargo install coreutils

インストールされると~/.cargo/bin/coreutilsができていると思います。このcoreutilsはmulti-call binaryと呼ばれる1つの実行ファイルの中に複数のプログラムをまとめたものでcoreutils lscoreutils echo hogeのように各種コマンドを実行できます。

このcoreutils lscoreutils echoを通常のコマンドと同じようにインタラクティブシェルから実行できるようにするためのaliasを定義する簡単なスクリプトを作成しました。

ちなみに僕はzshを使っているので、今回はzshrcに記述していく感じにします。

# zshrc
if [[ -e $HOME/.cargo/bin/coreutils ]]; then
    coreutils=("base32" "base64" "basename" "basenc" "cat" "chcon" "chgrp" "chmod" "chown" "chroot" "cksum" "comm" "cp" "csplit" "cut" "dirc
olors" "dirname" "du" "echo" "env" "expand" "factor" "false" "fmt" "fold" "groups" "hashsum" "head" "hostid" "hostname" "id" "kill" "link" "
ln" "logname" "ls" "mkdir" "mkfifo" "mknod" "mktemp" "mv" "nice" "nl" "nohup" "nproc" "paste" "pathchk" "pinky" "ptx" "pwd" "readlink" "real
path" "relpath" "rm" "rmdir" "runcon" "seq" "shred" "shuf" "sleep" "stat" "stdbuf" "sum" "sync" "tee" "timeout" "touch" "tr" "true" "truncat
e" "tsort" "tty" "uname" "unexpand" "uniq" "unlink" "uptime" "users" "wc" "who" "whoami" "yes" "date" "tail" "more" "df" "dd" "test")
    for i in $coreutils; do
        alias $i="coreutils ${i}"
    done
fi

zshrcを読み込めば、lsechouutils/coreutilsに置き換わると思います。

coreutilsuutils/coreutilsで置き換える方法を紹介しました。仮に不具合が発生しても、この方法ならaliasを削除するか、~/.cargo/bin/coreutilsを削除するだけで元の状態に戻すことができるので、環境を汚さずに済みます。さりげなくRust製のコマンドを使っているのも個人的にオシャレでグッドな感じがしてます。