fish-shell でシェルの海をスイスイ泳いでみた

Backlog開発チームの佐藤です。自宅と会社でWindows/Macを併用しているせいか、日本語と英語を切り替えるとき、自宅のWindowsではWindows+スペース、会社のMacではescキーをよく押してしまいます。

それはさておき、私がコンソールで操作するときはデフォルトで入ってるものをそのまま使います。Macデフォルトのbashのディレクトリ移動にいい加減疲れを感じたのと同時に、zshに憧れを抱いていました。そんな最中、fish shell」というシェルを見つけて超快適になったので、その素晴らしさをお伝えします

fishとは?

後ろがshとなっている通り、シェルの名前です。お魚じゃないよ!githubにてthe friendly interactive shellと自称しているだけあり、ユーザーフレンドリーさに重点を置いて開発されています。

fishの特徴として、他のシェルと比べると新しく(2005年リリース)、強力なサジェスチョン/補完機能、親切なシンタックスハイライト、GUI(ブラウザ)での設定/ヘルプページなどが”標準”で備わっていることが挙げられます。

インストール

インストールはすごく簡単です。Macでhomebrewを使用しているのなら

$ brew install fish

を実行するだけ。

Linuxですとディストリビューションのパッケージマネージャーからインストールすると、古いバージョンが入る場合があるので、公式が用意したリポジトリからインストールすることをオススメします。

Ubuntuならば公式のppaがありますのでそちらから。

$ sudo apt-add-repository ppa:fish-shell/release-2
$ sudo apt-get update
$ sudo apt-get install fish

その他OSへのインストール(debian含む)はこちらのGo fishからどうぞ。

感動した機能

サジェスチョンと補完

では、まずはサジェスチョンと補完機能から試してみましょう。
ホームディレクトリから試しに/usrディレクトリに移動(cd)してみます。

fishサジェスト1cd /uと入力したところ

上のスクリーンショットは、cd /uと打ち込んだ状態のシェルの様子です。
薄い字でsr/がサジェストされています。タブキーを押下しなくともサジェスチョンが教えてくれます。

では、途中まで同じフォルダ/ファイル名だった場合はどうでしょうか。この場合は、辞書順にソートし、その中で一番最初に来るものがサジェストされます。ですが、探したい名前はサジェストされたものである可能性は高くはないでしょう。

しかし、そんな時でもfishは親切な機能を提供してくれています。
今度は、/sと入力し、タブキーを2回押下させてみましょう。

フォルダのサジェストリスト選択しているところ

gifの通り、/sで始まるディレクトリが一覧表示されています。ここまででしたらbashなどにもある普通の機能なのですが、gifを見るとお判りいただける通り、表示されたリストから直接選択することが可能です。

移動も、タブキーだけでなく矢印キーでも可能です。
リストを見て残りの文字を打ち込んでまたタブを押す、という不毛なことをやる必要はありません。

また、fishは、子フォルダを走査する{directory}/*/のような指定もできますので、このようにも使えます。

ワイルドカードでを使ったサジェストリストワイルドカードでも一覧できる

これらのユーザーフレンドリーなサジェスチョンはパスに限られた機能ではありません。

Linuxコマンドやそれに与えるオプション、sshと入力してスペースを入れ、タブを押下すればknown-hostsに登録された接続先、mountでは現在マウントしているデバイスも表示させることができます。

タブキーを押下すれば、だいたい求めているものを補完してくれると思っても問題ないぐらいです。

なお、サブコマンドやオプションの補完は各アプリケーションのmanから生成しているため、fishをインストールした後にインストールしたソフトウェアの場合は補完が効きません。fishに生成させる必要があります。

しかし、難しい作業は必要ありません。

~> fish_update_completions

このコマンドを実行させるだけです。

シンタックスハイライト

シンタックスハイライトもデフォルトで付いてきます。

例えば、以下はclearの綴りをtypoしたものです。clareというコマンドは存在しないので赤文字で警告してくれています。

コマンドのtypoclearをtypoしているところ

これはコマンドだけでなく、ディレクトリパスでも同様です

ディレクトリパスをtypo/usrをtypoしたところ

/usrのtypoを想定して/userと入力しています。/userというディレクトリは存在しないため、こちらも赤文字で警告しています。

設定とヘルプページ

fishは設定ページとヘルプも一味違います。ターミナルのfish上で、helpと入力してみてください。ブラウザが立ち上がり、このようなページが表示されます。
 

fish shellドキュメントがブラウザで開かれる

fishにはmanページの他、ブラウザ上で見れるヘルプページが用意されています。

ただ、正直私自身この機能はどうでも良いと思っています。内容は公式ページのドキュメントと同じものですから。 すごいと思っているのはこちらの機能です。こちらも同じくターミナルのfish上で、fish_configと入力してみてください。

 カラー設定(テーマ)やプロンプトの設定やコマンド履歴などをブラウザ上から確認できます。
 

fish shell設定もブラウザで

特にカラー設定とプロンプトは、実際に表示されるサンプルを見ながら設定することが可能ですのでとても快適です。

というより、カラー設定をコマンドラインで設定しようとすると、fishの環境変数に通常の文字の色やechoなどで表示させる時のクオート内の文字などを1つずつ設定する必要があります。

プロンプトも、functionと呼ばれる関数を作成し自分で定義する必要がありますので、やはりブラウザから設定することをオススメします。

プラグインマネージャ

node.jsに対するnpmのように、fishにはプラグイン管理マネージャーがあります。プラグインマネージャーはいくつかありますが、その中でもよく使われているのがfishermanです。

インストール方法は、

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

を実行するだけ。

とはいっても、fishがそもそも至れり尽くせりなのでプラグインを入れる必要性をあまり感じません。

強いていうならば、デフォルトで入ってないテーマで気に入ったものがあればインストールするぐらいでしょうか。

 戸惑うところ

とても使いやすいfishですが、bash に慣れ親しんでいると戸惑うポイントがいくつかあります。それをいくつかご紹介。

シェルスクリプトの構文がbashなどとは違う

bashの構文がわかりにくいということで、fishではわかりやすい独自の構文に変更されている部分がありますが、それが戸惑いを引き起こすこともあります。

例として、andを意味する&&がfishでは使えません。

debian系OSでパッケージを更新するときにapt update && apt upgradeというのをよくやりますが、fishでは&&が使えないために、このコマンドはエラーとなり実行できません。

fishが受け付けるコマンドに置き換えると apt update; and apt upgradeとなります。

;で一度コマンドを区切り、andでコマンドを結合する必要があります。

なお、||も使えず、セミコロンで区切った後orを使い結合する必要があります。なんかpythonっぽいですね。

他にも、if ~ fiなどの条件式も構文が違います。詳しくはこの辺りを。

fishrcが存在しない

おなじみ~rcファイルがfishには存在しません。

では、どこで~rcファイルに書いていた設定を書くのかというと、~/.config/fishにあるconfig.fishというファイルに記載します。

当然ですが、bash系の記法は使えませんので、先に書いた独自の構文で記述する必要があります。なお、環境変数の設定はconfigに記載する以外にも、シェル上で直接設定することもできます。

シェル上で設定しても、その環境変数は永続化されますので、個人的にはシェル上で直接設定する方が好みですね。

肝心の設定方法ですが、fishではexportは使わず、setコマンドを使って設定します。

config.fishに記載する場合

set PATH /usr/local/bin $PATH

シェル上で設定する場合

set -U fish_user_paths /usr/local/bin $fish_user_paths

$fish_user_pathsとは、fishのユニバーサル変数の1つで、$PATHより先に読み込まれる変数です。

まとめ

最初に書いた通り、自分は基本的にデフォルトのまま使うことが多いので、インストールするだけで上記の機能が使えるfishは超快適です。

*rcファイルの違いやスクリプト文法の違いから、zshなどを使って.zshrcをゴリゴリカスタマイズしているような人には、これらの違いがストレスになる可能性があるのであまりオススメできないと思います。

逆にあまりいじらずデフォルトのまま使っている方や、zshで補完などをガンガン効かせたいけど、なんだか面倒そう・・・という方は試してみる価値はあるでしょう。

開発メンバー募集中

より良いチームワークを生み出す

チームの創造力を高めるコラボレーションツール

製品をみる