ぶていのログでぶログ

思い出したが吉日

bashからfishにした

今まで頑なにbashを使ってきたけどこの度fishに変更しました。 なお、tmuxのデフォルトシェルは変更したけど、ログインシェルはbashのまま!!*1

なんでbashにこだわっていたの?

Linuxサーバではデフォルトでbashが入っている。 手元の環境でもbashを使っていれば、どの環境でも違和感なくオペレーションができるはずという信念からbashを使っていた。

しかし、最近ではサーバ上でオペレーションするよりも手元でオペレーションしている頻度が圧倒的に高い。 また、サーバ上でbashを使っているとはいうが、本当にデフォルトのbashでしかなく、bash固有の機能を使っているわけでもないしキーバイドが同じであれば違和感なくオペレーションできるはず。

デフォルトのbashはお世辞にも使いやすいとはいえず、最近のモダンなシェルの機能を使いたくなったのが今ここだった*2

なんでfish?

当初、乗り換え先はzshを検討していた。 ノウハウも多くネットを検索したり、同僚に聞けばいろいろ情報が得られると思っていた。 しかし、zshも結局いろいろカスタマイズしないと、満足いく環境にならないだろうと言う懸念があった。

そんなときfish-3.0がリリースされたという話を聞いた。 fish-3.0ではなんと &&|| が使えるようになった!という話を聞いて興味をもったのでfishにした。

fishshell.com

fishに入れた設定

デフォルトのままで十分使いやすかったので、今は最低限の設定だけいれている。 特にbash時代に手癖になるほど使っていた自作コマンドのgcdeachだけはfishに移植した。

gcdはghqで管理しているリポジトリディレクトリにcdするコマンドで、eachはxargsの便利版だ。 あれこれ調べた結果以下のようなaliasコマンドで定義している。

alias gcd='set -l s (ghq list | fzf-tmux -1) && cd (ghq root)/$s; :'
alias each='string match -q -e "{}" -- $argv || set -a argv {}; xargs -r -L1 -I{} $argv;:'

ここでポイントなのが、最後に : をつけるところ。 これをつけなくても動作はするのだが、aliasしたコマンドに引数を渡すとエラーになってしまう。 これは、内部的にaliasしたコマンドの最後に $argv を追加するからである。 この追加された $argv を無効化するために : コマンドを呼び出している。

aliasコマンドを作るときにbashスクリプトとの違いを知るために以下のサイトを参考にした。 まさに私に必要な情報で大変にありがたい 🙏

qiita.com

まとめ

fishに変更してからまだ1日くらいしか経ってないがかなり満足している。 デフォルト設定でも十分便利で使いやすい。 1つ不満があるとしたらコマンド履歴をインクリメントサーチできない(bashでいうところのCtrl-r)ところ。 これは、pecoなどを使ったコマンドなんかで代用できるようだ。 本家のissueにも上がっていて3.1で何かしら動きがありそう?なので期待している。

github.com

*1:何も起こらないと思うけどチキって変更していない

*2:もちろんbashの設定を作り込めばいいのだろうけど、そこまでbashにこだわる理由もそこにかける時間もないのであった