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製のコマンドを使っているのも個人的にオシャレでグッドな感じがしてます。