bash/zshからfishシエルへ完全移行して、2ヶ月程度立ちました。fishシエルは、あまり設定をしなくても自動で補完してくれたり、便利で非常に満足しています。この2ヶ月触ってきたなかで、溜まってきた知見を紹介したいと思います。

fishへ移行しようと思ったきっかけ

存在自体は、1年前から知っていて、簡単に触ってみたことはあったのですが、“POSIX準拠”でないということが、なかなか導入に踏み切れずにいました。知人などから「使い勝手いいよ!」という話を聞きながら軽く流す日々が続いていました。ちょうど2ヶ月前ごろに、今まで使っていた環境の整理を初めてbash、zshのaliasなんかが煩雑に整理されずにいたので、ちょっと思い切って乗り換えてみようと思ったのがきっかけです。

fishって何?

fishというキーワードでGoogle検索を行うとがヒットします。今回は、魚ではなく「fish shell」の方です。検索する際には、shellまで一緒に入力したほうが良いです。「friendly interactive shell」からとって、fishという名前になっています。名前の付け方からも対話性や、わかりやすさ、ユーザフレンドリーさを重視していることが分かります。fish shellの6つの特徴が記載されています。その中で私が良いなと思っているところは、以下あたりです。

  • 補完機能
    かなり高性能、manの中も検索してくれる
  • シンタックス
    カラフルで、コマンドなど存在しないものを赤などどでエラーとして視覚で訴えてくれる
  • マニュアルが読みやすい
    完結に記載してあって読みやすい

また、fish shell自体は、2004年頃にver1系がリリースされているので、シェルの中ではかなり新しいものです。

fishに親しむ

fishをインストールしましょう。公式ページの下記部分に各OS毎のインストールが紹介されています。

Go fish

Macを利用されている方は、brewコマンドを利用してbrew install fishでインストールできます。インストールが完了したら、Tutorialをやってみると良いです。英語が苦手な方は、日本語版のチュートリアルもありますので、こちらをやって見て下さい。チュートリアルをやってみると、”1時間弱”で一般的なシェルスクリプトの構文やautoloadなどが理解できみます。このチュートリアルは、シンプルですが非常にわかりやすくまとまっています。

bash/zshの設定移行は?

最低限のものだけ移行しました。細かい記載方法の違いがありましたが、そのあたりもチュートリアルを実施した後だとトラブルシュートしながら解決できます。困ったときは、FQAを見ながら解決していきました。この置き換え作業の際にabbrというものがあることを知り感動しました。

abbrとは、Enterキーを押下したあとで展開されるaliasです。下記はマニュアルの説明です。

abbrの説明

設定ファイルにreloadを設定して実際に実行したときの様子です。

aliasよりも優れている点は、下記2つあると思います。

  • コマンドが展開されるのでペアプロなどで何をやったのかがわかりやすい
  • コマンド履歴では、展開後のコマンドが保持されているので検索がしやすい

プラグイン管理は?

Fisherというプラグイン管理があります。インストール方法は、下記のようにコマンドで一発です。

curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish

add、rmを引数にしてパッケージの追加、削除を行います。

completions

gitなど様々なコマンドを利用していると補完機能は重要です。

completionsの置き場については、ドキュメントには下記のように記載があります。

  • A directory for end-users to keep their own completions, usually ~/.config/fish/completions (controlled by the XDG_CONFIG_HOME environment variable);
  • A directory for systems administrators to install completions for all users on the system, usually /etc/fish/completions;
  • Directories for third-party software vendors to ship their own completions for their software. Fish searches the directories in the XDG_DATA_DIRS environment variable for a fish/vendor_completions.d directory; if this variable is not defined, the default is usually to search /usr/share/fish/vendor_completions.d and /usr/local/share/fish/vendor_completions.d;
  • The completions shipped with fish, usually installed in /usr/share/fish/completions; and
  • Completions automatically generated from the operating system’s manuals, usually stored in ~/.local/share/fish/generated_completions.

fish-shell向けのcompletionsに関しては、GitHubの下記のリポジトリにまとまっています。

fish-shell/share/completions at master · fish-shell/fish-shell · GitHub

gitを例にインストールする手順を示すと、下記のようなコマンドを実行すればOKです。

curl https://raw.githubusercontent.com/fish-shell/fish-shell/master/share/completions/git.fish ~/.config/fish/completions/git.fish

終わりに

今回は、fish shellというシェルについての紹介をしました。POSIX準拠していないという点がネックになるかと思いましたが、いざ置き換えてみるとすごく使いやすいというのが本音です。文法がbashと違いますが、一般的なプログラミング言語と比較してもわかりやすいので、若い方などは、正直、bashを頑張って勉強するよりもfishで覚えるというのも有りかなと思っています。正直、case文を記載する際の終了を表す「easc」なんかも、コードを書いていると直感的な感じがしないので、書きづらいと思うことが多くありました。導入ハードル自体も比較的高くないので、今後も利用者は増えていくのではないかと思っています。