uutils/coreutilsを使いたい
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 lsやcoreutils echo hogeのように各種コマンドを実行できます。
このcoreutils lsやcoreutils 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を読み込めば、lsやechoはuutils/coreutilsに置き換わると思います。
coreutilsをuutils/coreutilsで置き換える方法を紹介しました。仮に不具合が発生しても、この方法ならaliasを削除するか、~/.cargo/bin/coreutilsを削除するだけで元の状態に戻すことができるので、環境を汚さずに済みます。さりげなくRust製のコマンドを使っているのも個人的にオシャレでグッドな感じがしてます。
