何かしらのプログラムをインストールした時や、環境構築の時などで出てくるPATHを通すをまとめてみました。
PATHはコマンドサーチパスのこと
そもそもコマンドとは:
コマンドの実態は、特定の操作を実行するための実行ファイルを呼ぶこと
コマンドサーチパスとは:
コマンドサーチパスはそのコマンドの実行ファイルまでのパスのこと
このパスは環境変数PATHに設定されます。 コマンドが実行されると、シェルは環境変数PATHに設定されたディレクトリからコマンドの実行ファイルを探します。
*シェルに関しては別途記事を書きますのでここでは省略します。
例えばLinuxコマンドのlsであれば、ファイルの場所は /bin/ls
/bin/ls
ls
上記の2つのコマンドどちらを実行しても結果は同じですが、毎回フルパスを指定するのは面倒なので、シェルにあらかじめ実行ファイルの場所(=パス)を知らせておく必要があります。
このように、環境変数PATH にコマンドサーチパスを追加することをPATHを通すと言います。
これによって、毎回フルパスを指定せずに、どこのディレクトリにいてもファイル名だけでコマンドを叩くことができ、作業効率を高めてくれる、とても便利なものなのです。
*cdやechoのようなシェルのビルトインコマンド(シェル内部に組み込まれているコマンド)は、パスを通さずとも初めから使えます。それ以外のコマンドは外部コマンドで、PATHを通す必要があります。またツールによってはインストールした時に自動でPATHの設定をしてくれるモノもあったりします。
カレントディレクトリにパスを通さない
カレントディレクトリにパスを通すことは危険です。
通常、コマンドサーチパスは一般ユーザーがアクセスできないディレクトリに設定することで安全性を高めています。
しかし、カレントディレクトリ、つまり作業中のディレクトリにパスを通してしまうと、コマンドサーチパスが管理者以外にもアクセス可能なディレクトリに設定される事となり、悪意のあるプログラムが実行される危険性が増大します。
セキュリティの大原則で
・余計なディレクトリにパスを通してはいけない
・パスを通す際は安全なディレクトリに絞って設定する。
カレントディレクトリのファイルを実行したい場合にはファイル名の先頭に./をつけて実行することになっています。これは「今私のいるディレクトリのこのファイルを実行して!」というように、一時的にカレントディレクトリにパスを通してあげているイメージです。
環境変数とは
コンピュータ上の全てのプロセスで有効な変数のこと。
私たちが使っているOS上に定義されたグローバル変数のようなもの。OS上で動くアプリケーションから、ちょっとしたスクリプトまで、実行中のプロセスは環境変数を参照して、その動作を切り替えられます。
macOSやLinuxなどUNIX系のOSでは、環境変数は基本的には.bashrcや.zshrcなどに設定し、シェルを起動すると常に同じ値が適用されます。
通常はこれで問題ありませんが、開発するアプリ毎に固有の環境変数を設定したい場合
(例:あるアプリのフォルダ内でだけ、環境変数としてAWSの認証キーを設定して使用したい)だと不便です。
その環境変数を毎回設定するのも大変ですし、忘れてしまいます。
また.bashrcなどに全部設定しロードしておく事もできますが、プロジェクトが増えてくると煩雑になり困ります。
そこで便利なツールがdirenvなのです。
本記事では、このdirenvを使い、そのディレクトリ固有の環境変数ファイルを作って読み込ませる設定をしてみようと思います。
direnvとは
Shellのエクステンションツールで、ディレクトリ毎に環境変数を定義して、そのディレクトリがカレントになった時だけ、その環境変数を有効/無効にしてくれるツール。
direnvはディレクトリ毎に環境変数を定義できて、.envrcというファイルに環境変数を適用します。
.envrcがあるディレクトリがカレントディレクトリになった時に環境変数が有効になります。
.envrcを探すので、存在しなければ関係ない
ちなみにdirenvは、directory environmentの略だと思います。そのディレクトリ固有の環境変数という事ですね。
実際にやってみましょう
まずは、direnvをインストールする
mac上でHomebrewを利用しているのであれば、brew install direnv
環境変数を設定したいプロジェクトのルートディレクトリに、.envrcファイルを作ります。
touch .envrc
使いたい環境変数を下記のように設定します。
export 環境変数名 = 値
bashにシェルのフックを設定する(zshでもOK)
自動で読み込むための設定です。
ルートディレクトリに移動して、vimでbashrcかzshrcを開く
vim ~/.bashrc
もしくは
vim ~/.zshrc
キーボードのiを押して、insert(入力)モードにして、以下を記述
eval "$(direnv hook bash)"
もしくは
eval "$(direnv hook zsh)"
キーボードで:wqと入力すると保存終了。
.bashrcを再読み込みする
source [ファイルパス]で、パスの設定を読み込んで現在のシェルを実行するコマンド
シェルの設定ファイル(.bashrc)を更新した後で、変更内容を実行中のシェルに反映させる。
source ~/.bashrc
もしくは
source ~/.zshrc
.envrcを置いたディレクトリに移動すると、こんなエラーが出ると思うので、
direnv allowを実行してdirenvを許可すれば大丈夫です。これで設定完了。
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
cdコマンドで別のディレクトリ(.envrcのないディレクトリ)に移動すると、この様に環境変数がunloadされます。
direnv: unloading
再び移動するとloadされます。なので、上記の設定は最初だけやればOKです。
direnv: loading .envrc
もし.envrcファイルの設定を書き換えた場合は、自動で.envrcを読み込み直してくれますが、稀にdirenv allowを求めるエラーが出るので、そしたらdirenv allowしてあげればOKです。
最後に、環境変数にはアクセストークンやAPIキーなどが第三者に渡ってしまうとまずいデータを設定することが多いと思うので、.gitignoreに.envrcを追加するのが一般的です。
envrc, bashrcのrcとは?
サクッと調べたらおそらくrun commandsの略という説が濃厚です。