🐟
fish shellでbatとezaを自動切り替えする関数 bate を実装
結論
> functions detail bate
# Defined via `source`
function bate
if test -d $argv
eza $argv
else
bat $argv
end
end
解説
なぜ作るのか?
bat
コマンドはRust製のcatツールです。
このbatツールはファイルを指定したらファイルを開きますが、ディレクトリを指定した場合はエラーになります(この挙動はcatコマンドと同じです)
batの実行例
# ファイルを指定したらそのままファイルの中身を出力
> echo 'hoge' > hoge.txt
> bat -p hoge.txt # (-p はプレーンテキスト出力)
hoge
# ディレクトリを指定したらエラーを出力
> mkdir dir1
> bat dir1
[bat error]: 'dir1' is a directory.
このエラーが出た時、ほぼ毎度手動でディレクトリの中身を出力してファイルを探し直しています。
そこで、ディレクトリを指定してしまった時はそのディレクトリの中を出力するようにしたいです。
ディレクトリの中身を表示するのは eza
コマンドというRust製のlsツールで行います。
ezaの実行例
> eza -T # (-T はツリー表示のオプション)
.
├── dir1
└── hoge.txt
fishで関数を作成
fish では 関数を function
コマンドで定義します。
> function [option] NAME; BODY; end;
引数の扱い
コマンドの引数は $argv
という変数に格納されます。
条件判定 & 分岐
fishは test
コマンド で判定を行います。
test
コマンドは条件に従って引数を判定し、その判定結果が正しければ終了ステータスに 0
を、正しくなければ 1
を格納します。
コマンドの終了ステータスは $status
に格納されます。
パスの中身がファイルかディレクトリかを判定するには、 -d
でディレクトリかどうかを判定します。
> test -d hoge.txt
> echo $status
1 # hoge.txtはディレクトリではないため 1
> test -e hoge.txt # -e でファイルが存在するかどうかを判定する
> echo $status
0 # hoge.txt は存在するため正しくて 0
分岐には if
コマンド で分岐します。
if
コマンドは 終了ステータスによって処理を分岐させます。
書き方はよくある if ~ else
と同じです。
> if test -e hoge.txt
> echo 'It is true!'
> else
> echo 'It is false!'
> end
> It is true!
関数を作成
上記のことを踏まえてfish shellに関数を定義します。
> function bate
if test -d $argv
eza $argv
else
bat $argv
end
end
> funcsave bate # funcsave を実行しないとファイルに出力されないため注意
funcsave: wrote /Users/XXXXXX/.config/fish/functions/bate.fish
Discussion