direnvは、ディレクトリ毎に環境変数を定義することで、ディレクトリがカレントになった時だけ環境変数を有効にできるツールです。
インストール手順のhook direnv into your shell.
で設定している内容が気になったため、少し調べてみました。
hook direnv into your shell.
で何をしているの?
Bashの場合、~/.bashrc
ファイルの末尾にeval "$(direnv hook bash)"
を追加しています。
Add the following line at the end of the ~/.bashrc file:
eval "$(direnv hook bash)"
それでは、~/.bashrc
ファイルとeval "$(direnv hook bash)"
についてそれぞれ調べていきましょう。
~/.bashrc
ファイルとは
Bashのマニュアル6.2 Bash Startup Filesに記載があり、Bashが対話型シェルとして起動される時に読み込まれるファイルです。
Invoked as an interactive non-login shell
When an interactive shell that is not a login shell is started, Bash reads and executes commands from ~/.bashrc, if that file exists.
eval "$(direnv hook bash)"
とは
こちらはもう少し分解して調べた方がよさそうです。
以下の要素に分解して調べていきましょう。
- eval
- ""
- $()
- direnv hook bash
evalとは
Bashのマニュアル4.1 Bourne Shell Builtinsに記載があり、引数に記載したコマンドを読み込み実行することができます。
eval [arguments]
The arguments are concatenated together into a single command, which is then read and executed, and its exit status returned as the exit status of eval. If there are no arguments or only empty arguments, the return status is zero.
""とは
Bashのマニュアル3.1.2.3 Double Quotesに記載があり、二重引用符("")の中ではパラメータとコマンドの置換が行われます。
Enclosing characters in double quotes (‘"’) preserves the literal value of all characters within the quotes, with the exception of ‘$’, ‘`’, ‘\’, and, when history expansion is enabled, ‘!’.
$()とは
Bashのマニュアル3.5.4 Command Substitutionに記載があり、$()
で括られたコマンドはそのコマンドの出力に置き換えられます。
Command substitution allows the output of a command to replace the command itself. Command substitution occurs when a command is enclosed as follows:
$(command)
また、$()
を二重引用符で囲むことで、出力が単語に分割されず単一の文字列としてシェルの入力に渡されます。
If the substitution is not enclosed in double quotes, the output is broken into words using the IFS parameter.
前述した""
を併用し"$()"
とすることで、コマンド置換の出力を単一の文字列としてシェルに渡すことができます。
direnv hook bash とは
direnvのhookコマンドです。引数にbash
を指定することでBash用のフックを設定するためのスクリプトを出力しています。
コマンドの詳細はdirenvのGitHubで確認できますが今回は割愛させていただきます。
eval "$(direnv hook bash)"
についてまとめ
各要素に分解して調べた結果をまとめます。
-
direnv hook bash
でBash用のフックを設定するためのスクリプトを出力する -
eval "$()"
で上記出力を単一の文字列としてシェルに渡し実行する
hook direnv into your shell.
でしていること
~/.bashrc
ファイルとeval "$(direnv hook bash)"
についてそれぞれ調べた結果から、Bashの起動時に、Bash用のフックを設定するためのスクリプトを実行していることがわかりました。
まとめ
いかがでしたでしょうか?
hook direnv into your shell.
でしていることについてはわかりましたが、direnvのhookコマンドで出力されるBash用のフックを設定するためのスクリプトが何をしているのかも気になりました。
次は、Bash用のフックを設定するためのスクリプトについても調べてみたいと思います。