tl;dr
- シェル設定ファイルの
direnv hook
の設定を確認- ex).
.bashrc
や.zshrc
を確認
- ex).
事象
原因
シェル設定ファイルにhookする設定の追加が漏れていた。
解決方法
手元の環境はzshなので、.zshrcにeval "$(direnv hook zsh)"
を追加することで、direnvが正常に機能するようになった。
詳解
direnv hook
はdirenvをシェルに統合するためのコマンドで、各shに対する初期化スクリプトのコードを出力する。このコードが実行されることで、direnvが自動的に動作し、環境変数のロード・アンロードを行う。
zshの場合のdirenv hookの出力
_direnv_hook() { trap -- '' SIGINT eval "$("/Users/hoge/.asdf/installs/direnv/2.34.0/bin/direnv" export zsh)" trap - SIGINT } typeset -ag precmd_functions if (( ! ${precmd_functions[(I)_direnv_hook]} )); then precmd_functions=(_direnv_hook $precmd_functions) fi typeset -ag chpwd_functions if (( ! ${chpwd_functions[(I)_direnv_hook]} )); then chpwd_functions=(_direnv_hook $chpwd_functions) fi
_direnv_hook関数
direnvを呼び出し、環境変数を更新する。
1行目のtrapでSIGINTを無視し、処理中に中断されないようにしている。
direnv export zsh
で.envrc
を読み込み、3行目のtrapでSIGINTに対する処理をデフォルトに戻している。
precmd_functions
precmd_functions
に_direnv_hook
が含まれない場合、precmd_functions
に追加。
こうすることで、プロンプトが表示される直前に_direnv_hook
が実行される。
chpwd_functions
chpwd_functions
に_direnv_hook
が含まれない場合、chpwd_functions
に追加。
こうすることで、カレントディレクトリが変更された場合に_direnv_hook
が実行される。