Edited at

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

More than 3 years have 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.