OSX
fish

fish shellの起動が遅くなった時の解決方法

More than 1 year has passed since last update.

TL;DR

  • fish shellの起動に3〜4秒ぐらいかかるようになった。
  • config.fish$fish_user_pathsの設定方法に問題があった。
  • この問題の原因と解決方法をまとめた。

何が起きたか

  • fish shellを起動してコマンドが入力できるようになるまで、3〜4秒かかっていた。
  • iTermでタブを開いたり、tmuxでタブを開いても同様の時間がかかっていた。
  • 作業効率がめちゃくちゃ落ちていた。

環境

  • OS X (El Capitan) 10.11.3
  • fish, version 2.2.0

原因

fish shellのGitHubに同じ問題についてissueが上がっていた。
https://github.com/fish-shell/fish-shell/issues/2688

In general there should be no set -U lines in config.fish. #2005 tracks warning for this case.

The reason is that set -U calls create variables that persistently remember their values, so running set -U fish_user_paths $fish_user_paths /opt/bin on each launch just make $fish_user_paths longer and longer.

意訳

一般的にconfig.fish内ではset -Uを使うべきではない。#2005 ではこのケースのワーニングについて動きを追っている。
set -Uすると永続的に保存される変数が作られる。毎回起動時に$fish_user_pathsはどんどん長ってしまう。

肥大化した $fish_user_paths を引き継いだまま新しい $fish_user_paths を作ろうとするため、起動に時間がかかってしまう。

解決方法

config.fish に書かれている一番最初の set -U 第3引数を消す。

# before
set -U fish_user_paths /usr/local/bin $fish_user_paths
set -U fish_user_paths ~/.rbenv/shims $fish_user_paths

# after
set -U fish_user_paths /usr/local/bin
set -U fish_user_paths ~/.rbenv/shims $fish_user_paths

意味

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

これは$fish_user_paths の頭に /user/local/bin を追加して fish_user_paths という変数を作るという意味。
$fish_user_pathsの前回のデータの頭に新しいデータが追加されるため、起動の度に$fish_user_pathsはどんどん大きくなってしまう。

set -U fish_user_paths /usr/local/bin

第3引数を消せば、fish_user_paths/user/local/bin で毎回初期化されるため、$fish_user_paths は肥大化しない。

ちなみに

今回の問題はEl Capitanで発生したが、Yosemiteでは同じ原因でfishが起動できないという問題があった。
https://github.com/fish-shell/fish-shell/issues/2005

このissueで下記のようなコメントがあるため、El Capitanでの問題もfishのv2.3では改善されるかもしれない。
https://github.com/fish-shell/fish-shell/issues/2005#issuecomment-192891400

This probably won't happen for 2.3.