CUBE SUGAR CONTAINER

技術系のこと書きます。

direnv を使ってみる

direnv は特定のディレクトリのみで有効な環境変数や設定を行うためのアプリケーション。

今回はそれを Mac OS X で使ってみる。

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.10.5
BuildVersion:   14F27

direnv をインストールする

direnv は Homebrew を使ってインストールできる。

$ brew install direnv

初期設定

direnv を使うには、まずシェルの設定ファイルに direnv 用のフックを仕込む必要がある。 これは、direnv が cd コマンドなどをフックして動作するため。

使用しているシェルが zsh の場合は以下のようにする。

$ echo 'eval "$(direnv hook zsh)"' >> ~/.zshrc
$ source ~/.zshrc

bash を使っている場合はこう。

$ echo 'eval "$(direnv hook bash)"' >> ~/.bashrc
$ source ~/.bashrc

direnv を使ってみる

まず、特定のディレクトリを指定して direnv edit コマンドを実行することでテキストエディタが立ち上がる。 ここにシェルスクリプトを書いておくと、ディレクトリに移動した際にそのスクリプトが実行される。

$ direnv edit /tmp

尚、上記のコマンドを実行するには環境変数 EDITOR が設定されている必要があるので注意しよう。

$ export EDITOR=vim

例えば、今回は GREET という名前の環境変数を定義してみよう。 設定はそのディレクトリの .envrc というファイルに書き込まれる。

$ cat /tmp/.envrc
export GREET="Hello, World!"

設定ファイルを定義したディレクトリに移動すると環境変数が読み込まれる。

 $ cd /tmp
direnv: loading .envrc                                                                    
direnv: export +GREET
$ echo $GREET
Hello, World!

尚、別のディレクトリに移動すると環境変数は unset される。

$ cd $HOME
direnv: unloading  
$ echo $GREET

手動で .envrc を設定する

上記を見て、そんなまどろっこしいことをしなくても、以下のように直接設定ファイルを書いてしまえば良いじゃないか、と思った人もいるはず。

$ cat << EOF > /var/tmp/.envrc
export GREET="Hello, World!"
EOF

ただ、このままだと direnv は .envrc ファイルを読み込んでくれない。

$ cd /var/tmp
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.               

手動で設定ファイルを作ったときは direnv allow コマンドで、そのディレクトリを direnv の管理対象ディレクトリに加えてやる必要がある。

$ direnv allow /var/tmp
direnv: loading .envrc                                                                    
direnv: export +GREET
$ echo $GREET
Hello, World!

ちなみに、direnv は以下のディレクトリで管理対象のディレクトリを管理しているようだ。

$ ls ~/.config/direnv/allow
419927cd4b55ed5ccb3882622af0cb01e72ac116c321d995854037b9143be455
4641be16dabe150a0986abf33e06faa70d4850da7e88e09bf675b894ea266fd8

いじょう。