それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ディレクトリ単位でシェルの環境変数を切り替えるdirenv

npm / rbenv / pyenv みたいな感じの bashenv がほしい。

npm などを ディレクトリ単位で切り替えていると、どうしてもbashrc と整合性が合わなくなる時がある。

そのために、ディレクトリ単位でシェルの設定やエイリアスを切り替えられると便利だよね。

ってことで調べたてたら見つけたのでメモ

インストールと利用

brew install direnv

初期設定

eval "$(direnv hook bash)"

必要であれば、.bashrc に追記する。

利用

適当な作業用ディレクトリ(ここでは /tmp 、普段は Project フォルダ)に入る

takuya@$ cd /tmp
takuya@tmp$ mkdir tmp

direnv を有効にする

takuya@tmp$ direnv allow .

環境変数を設定した $DIR/.envrc を作る

カレントディレクトリに作った時点で即時にロードされてカッコイイ。

takuya@tmp$ echo "export foo=bar" > .envrc
direnv: loading .envrc
direnv: export +foo

別のディレクトリに移動すると環境変数が消される。

takuya@tmp$ cd ~
direnv: unloading
takuya@~$

先程のディレクトリに戻ると、環境変数が再ロードされる。

takuya@~$ cd -
/tmp/tmp
direnv: loading .envrc
direnv: export +foo

便利な点

毎回まいかい、source 叩かなくて良くなって嬉しい。

しかも、元の環境に戻してくれる。便利。

さらなる便利な点。

環境変数が名前かぶってたらどうなるのかな?

takuya@~$ cd ~
takuya@~$ pwd
/Users/takuya
takuya@~$ export foo=baaaa
takuya@~$ echo $foo
baaaa
## この状態で direnv による上書きをしてみる。
takuya@~$ cd /tmp/tmp
direnv: loading .envrc
direnv: export ~foo
takuya@tmp$ echo $foo
bar
takuya@tmp$ cd -
/Users/takuya
direnv: unloading
### 元通り!!!
takuya@~$ echo $foo
baaaa
takuya@~$

わりと安心して使えるし細かいことを考えなくて良くなるので便利だと思う。

残念な点

alias とか function は読み込んでくれないんだよなぁ。

参考資料