&&が使えるようになったのでfish-3.0をデフォルトシェルにして見た。
— ぶてい (@buty4649) 2019年1月9日
今まで頑なに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にした。
fishに入れた設定
デフォルトのままで十分使いやすかったので、今は最低限の設定だけいれている。
特にbash時代に手癖になるほど使っていた自作コマンドのgcd
とeach
だけは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スクリプトとの違いを知るために以下のサイトを参考にした。 まさに私に必要な情報で大変にありがたい 🙏
まとめ
fishに変更してからまだ1日くらいしか経ってないがかなり満足している。 デフォルト設定でも十分便利で使いやすい。 1つ不満があるとしたらコマンド履歴をインクリメントサーチできない(bashでいうところのCtrl-r)ところ。 これは、pecoなどを使ったコマンドなんかで代用できるようだ。 本家のissueにも上がっていて3.1で何かしら動きがありそう?なので期待している。