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
いじょう。