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.