LoginSignup
1
1

More than 5 years have passed since last update.

fishでanyenvを(**env入れるたびに手作業でスクリプト書き換えせずに)使う

Last updated at Posted at 2018-12-30

はじめに

最近シェルをfishに変えました。
普段はnode.jsのバージョン管理にnvmを使っていたのですが、この機に乗じてanyenv+nodenvを使うようにしました。
(最初はanyenv+ndenvにしてましたが、ndenvがdeprecatedになっていたのでnodenvにしています。)

fishにanyenvをセットアップする方法を調べると、たとえば↓の記事がヒットします。
https://qiita.com/sea_ship/items/996ebb228e4eafa48c11

すると、下のように書いてあります。

~/.config/fish/config.fishを編集してndenvのパスを通します。
anyenv init -の実行結果からndenvのROOTPATHとPATHを通すためのコマンドをコピーします。

anyenv init -とすれば良いだけのはずが、anyenvのバグ(?)のため手作業でパスを通す必要があるとのこと。
これでは**envを新たにインストール/アンインストールするたびにパスを更新する必要があり、非常に面倒です。

そこで、手作業に頼らずにanyenv initする方法を探しました。

2019/01/08 追記

コメントにて、anyenvがfish対応されていることをご指摘いただきました。
anyenvにpathを通した状態で、

$ anyenv init

した結果をconfig.fishに追記するだけで良いようです。

ただし、私が確認した限りでは、ndenvをインストールしている場合にはこの方法だとエラーになりました。
ndenvnenvをdeprecatedにする動きもありますので、これらを使っている場合はnodenvに乗り換えるのが良いかと思われます。

ちなみに、上記確認したときの環境は以下の通りです。

追記終わり

手順

現状の問題

anyenvのREADMEを見ると、以下のようなInstall手順が書いてあります。

$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.your_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.your_profile
$ exec $SHELL -l

このとき、anyenv init -を実行すると、実行中のシェル用のイニシャライズスクリプトが吐き出されるはずなのですが、fishの場合はbashの文法が混ざってしまうというバグがあります。

解決方法

そこで、fishのプラグインedc/bassを使うことを考えました。
このプラグインは、bashのスクリプトをfishで実行できるようにしてくれるものです。

私はfisherman(v3)を使ってfishのプラグインを管理しているので、以下のコマンドでインストールしました。

fisher add edc/bass

その後、config.fishに以下を追記します。

set -x PATH $PATH $HOME/.anyenv/bin
bass 'eval "$(anyenv init - bash)"'

anyenv initの第二引数にはシェルの種類を渡すことができます。
anyenv init - bashとすることで、bash用のイニシャライズスクリプトを吐き出させることができます。
bash用のスクリプトをbassに渡すことで、bashスクリプトをfishで実行することが可能になります。

まとめ

おそらくanyenvのバグだと思うので、こういったハックをせずとも動くようになるといいですね。

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1