前書き
本記事では、CLI(Terminal)で用いるinteractive shellを**fish(friendly interactive shell)に移行する方法を記載します。fishは、Debian環境のdefault shellであるdash(POSIX互換のash拡張)やlogin shellであるbash**よりも優れた点が多いです。
fishの優れた点
- 強力なサジェスト(予測変換)・補完機能
- Tabキーを押すと、入力中コマンドの機能説明を表示(下画像)
- Terminalのカラースキーム設定が容易
- Webインターフェースでも設定変更が可能
- パッケージマネージャ(fisher)で機能拡張が可能
- デフォルト設定で使いやすい

上表で示した内容以外にも、他の高機能shell(zshなど)よりも学習コストが低い、Vimのkey bindingが使用可能など、細かい点で利点があります。ただし、唯一のデメリットとして、「fishはPOSIX互換でない事(Default shellに向かない事)」が挙げられます。
本記事では、POSIX非互換というデメリットに配慮しつつ、Login shellをbashからfishへ移行する手順を示します。
検証環境
Debian9(stretch)環境を使用します。Default shellはdash、Login shellはbashという環境です。
_,met$$$$$gg. nao@debian
,g$$$$$$$$$$$$$$$P. ----------
,g$$P" """Y$$.". OS: Debian GNU/Linux 9.9 (stretch) x86_64
,$$P' `$$$. Kernel: 4.9.0-9-amd64
',$$P ,ggs. `$$b: Uptime: 1 day, 5 hours, 31 minutes
`d$$' ,$P"' . $$$ Packages: 2284
$$P d$' , $$P Shell: bash 4.4.12
$$: $$. - ,d$$' Resolution: 2560x1080
$$; Y$b._ _,d$P' DE: Cinnamon 3.2.7
Y$$. `.`"Y$$$$P"' WM: Mutter (Muffin)
`$$b "-.__ WM Theme: Cinnamon (Albatross)
`Y$$ Theme: BlackMATE [GTK2/3]
`Y$$. Icons: Gnome [GTK2/3]
`$$b. Terminal: gnome-terminal
`Y$$b. CPU: Intel i3-6100U (4) @ 2.3GHz
`"Y$b._ GPU: Intel Integrated Graphics
`""" Memory: 5106MB / 32069MB
(注釈):Default shellの確認。dashへのシンボリックリンク。
$ ls -al /bin/sh
lrwxrwxrwx 1 root root 4 1月 24 2017 /bin/sh -> dash
(注釈):Login shellの確認。一番右側にLogin shellであるbashが記載されています。
$ grep $USER /etc/passwd
nao:x:1000:1000:CHIKAMATSU Naohiro,,,:/home/nao:/bin/bash
fishとfisherのインストール
まずは、fish(shell)とfisher(fishプラグインマネージャ)をインストールします。Debian9(stretch)以降であれば、aptでfishを取得可能です。fisherは、公式サイトのインストール手順で取得します。
$ sudo apt install fish
$ curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish
Login shellのみをfishに変更
「前書き」で記載したとおり、fishはPOSIX互換性がありません。そのため、Default shell をfishに変更した場合(/bin/shのシンボリックリンクが/usr/bin/fishの状態)、POSIX互換を前提としたshell scriptを読み込めず、何らかの動作異常を起こす可能性があります。
以上を踏まえると、「Default shellはdashのまま」とし、「Login shellのみをfish」に変更します。なお、.bashrcに"exec fish"を記載し、Login shellはbashのままfishを起動する方法があります。しかし、この方法ではexportした環境変数設定が弾き継がれません。そのため、Login shell自体をfishに変更する方法を採用しました。
fishは、.bashrc(bash用の設定ファイル)に記載された設定を読み込みません。そのため、.bashrcに記載されている設定を"~/.config/fish/config.fish"に移行します。この際、.bashrcとconfig.fishで環境変数設定(export)の書式が異なるため、注意が必要です。
まずは、Login Shellをbashからfishに変更します。
(注釈):Login shellとして使用できるshell一覧にfishがある事を確認
$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/fish # ★
(注釈):Login shellをfishに変更。
$ chsh --shell /usr/bin/fish
次に、.bashrcに記載したexportやalias設定を"~/.config/fish/config.fish"に移行します。特に、自分で設定していない場合は、以下の手順は不要です。
(注釈):私の環境で、.bashrcに記載した設定は、以下の4行
$ cat ~/.bashrc | tail -n 4
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/bin/javac
export PATH=~/bin:$PATH
alias vi="/usr/local/bin/nvim"
source $HOME/.cargo/env
$ touch ~/.config/fish/config.fish
$ vi ~/.config/fish/config.fish (注釈):好きなエディタを使用して良い
(注釈):設定内容は以下の通り。
# 環境変数(書式:set -x PATH hoge. リスト形式 not コロン区切り)
set -x JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/bin/javac
set -x PATH ~/bin $PATH
# エイリアス
alias vi='/usr/local/bin/nvim'
# 別ファイル設定読み込み
source $HOME/.cargo/env
お前を消す方法:Welcome to fish, the friendly interactive shell
上記の手順の後にTerminalを再起動すると分かりますが、fish起動後に
Welcome to fish, the friendly interactive shell
nao@debian ~>
と、毎回Welcomeメッセージが出ます。そのため、"~/.config/fish/config.fish"に"set fish_greeting"を追記し、メッセージの出力を抑制します。
# fish起動時のWelcome~メッセージを表示しない
set fish_greeting
[the_ad id=“598”]
Terminalのカラースキームを変更
FishはTerminalのカラースキームが複数用意されています。最も簡単にカラースキームを設定する方法は、後述するWebブラウザを用いる方法です。
この節では、oh-my-fish(GitHub、サンプル画像つき)とfisherを用いて、自分好みのカラースキームを設定する方法を示します。
(注釈):引数を"oh-my-fish/theme-(好きなカラーテーマ名)"に置換する事
$ fisher add oh-my-fish/theme-bobthefish
(注釈):bobthefishは依存しているfontがあるため、別途インストール
$ sudo apt install python3-pip
$ sudo pip3 install powerline-status
$ sudo apt install fonts-powerline
今回の例で使用したbobthefishは、別途カラースキーム一覧があります。好きなカラースキームを探して、"~/.config/fish/config.fish"に"set theme_color_scheme (カラースキーム名)“を追記すれば、反映されます。カラースキームの色合いをテストする場合は、”__bobthefish_display_colors"で確認できます(下画像)。

便利pluginのインストール
「最近使用したディレクトリにジャンプできるz plugin」および「あいまい検索ができるfzf plugin」のみをインストールします。
(注釈):"z (ディレクトリ名)"で、最近使用したディレクトリにジャンプ可能
$ fisher add jethrokuan/z
(注釈):曖昧検索のfzfラッパー
Ctrl+f:ファイル曖昧検索、Ctrl+r:コマンド履歴の曖昧検索、Alt+o:ディレクトリ検索
$ git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
$ ~/.fzf/install
$ fisher add jethrokuan/fzf
$ echo "" >> ~/.config/fish/config.fish
$ echo "# FZFの古いキーバインドを使わない" >> ~/.config/fish/config.fish
$ echo "# (昔、fishのキーバインドとコンフリクトしたため)" >> ~/.config/fish/config.fish
$ echo "set -U FZF_LEGACY_KEYBINDINGS 0" >> ~/.config/fish/config.fish
他に設定を変更する場合:Webブラウザで設定
fishは、設定をWebブラウザ経由で変更することが出来ます。Terminalで"fish_config"と入力し、実行すれば以下の画面が開かれます。後は、ユーザの好みで設定を適宜変更して下さい。

