概要
ターミナルでよく聞く「パスを通す」とか「export PATH=...」って、最初はよく分からないですよね。
でもこれ、実は開発環境を快適に整えるうえでめちゃくちゃ重要な概念なんです。
この記事では、初心者にもわかりやすく「パスを通すってどういうこと?」「exportって何?」
という疑問をシェルの裏側で何が起きているのかにフォーカスしてまとめていこうと思います。
さらに、実際の設定ファイルの例や、よくあるトラブルとその対処法、開発現場での活用例なども盛り込み、理解を深めていきましょう。
パスを通すの意味とは?
「パスを通す」とは、特定のディレクトリを$PATH
という環境変数に追加することを意味します。これをしておくことで、そのディレクトリ内にあるコマンド(実行ファイル)を、どこにいても直接呼び出せるようになります。
例えば、~/my_tools/bin/terraform
という実行ファイルがあるとき、パスを通していないとこう打つ必要があります:
~/my_tools/bin/terraform plan
でも、パスを通していれば:
terraform plan
で済むわけです。これが、毎回長いパスを書かずに済む「快適さ」の正体です。
パスを通すという操作は、面倒なフルパス入力の手間を省き、どのディレクトリにいても一貫してコマンドを使えるようにするという大きなメリットをもたらします。
シェルが処理する流れ
ターミナルでコマンドを入力したとき、シェルは以下のような処理フローになっています。
- ターミナルに
terraform
と入力 - シェルが $PATH(OSやシェルがデフォルトで初期値を設定してくれている)に登録されたディレクトリを左から順に検索
- 最初に見つかった
terraform
という名前の実行ファイルを発見! - それを実行
この一連の流れが、毎回ターミナルでコマンドを入力したときに自動で行われています。
$PATHは「コマンドを探す場所の一覧」が入ってる環境変数のことで、
例えば、ユーザーがシェルにhogeと入力してEnterを押すと、シェルは以下のような動きをします。
1. シェルが $PATH の中にあるディレクトリを、左から順に探す
(例:/usr/local/bin → /usr/bin → ...)
2. 各ディレクトリ内に hoge という実行可能なファイルがあるかをチェック
3. 見つかったら、それを実行し、見つからなかった場合は、以下を表示する
command not found: hoge
$PATHにどんな値が入っているかは
echo $PATH
で確認できるので、中身を確認しシェルがどのパスを探しにいくのか確認すると
理解が深まるでしょう。
実例:command not found が出たときの解決手順
以上までの知識をもとに command not found
が表示されたとき、どうやって解決すればよいかをステップバイステップで紹介します。
例:mytool
というコマンドを実行したが、以下のエラーが出た
zsh: command not found: mytool
ステップ1:コマンドのインストール場所を確認する
find / -name mytool 2>/dev/null
ステップ2:自分の使っているシェルを確認する
echo $SHELL
ステップ3:対応する設定ファイルを開く
- bash の場合:
~/.bash_profile
または~/.bashrc
- zsh の場合:
~/.zshrc
ステップ4:PATH を通す
export PATH="/usr/local/mytool/bin:$PATH"
ステップ5:設定を反映する
source ~/.zshrc # または ~/.bash_profile
ステップ6:再確認
which mytool
mytool --help
以上が解決手順になります。
補足
最後に補足となりますが、ここまでの解説でもよく分からないところがあると思いますので(筆者も初学時分からなかった部分)、ここにまとめておきます!
$
の有無の違い
$PATHという書き方の他にPATHという書き方もありますが、
この2つは何が違うんでしょうか。
実は以下のような違いがあります。
書き方 | 意味 |
---|---|
PATH=... |
変数 PATH に値を代入する |
$PATH |
変数 PATH の中身を参照する |
例えば次のような使い方がよくあります:
export PATH="$HOME/my_tools/bin:$PATH"
この例では、$PATH
が右辺に使われていて「現在のPATHにさらにパスを追加する」構文になっています。
export PATH=...
と PATH=...
の違い
exportの有無では、何が変わるのでしょうか。
この2つの違いは、環境変数のスコープ(有効範囲)にあります。
具体的には、以下の違いがあります。
- exportついていない場合:自分のシェルでしか使えない一時的な変数
- exportついている場合:子プロセス(例えば新しく開いたシェル)にも引き継がれる環境変数になる
たとえば次のように確認できます:
FOO=hello
bash
# 中に入ったシェルでは
echo $FOO # → 何も表示されない
でも、
export FOO=hello
bash
# 表示される!
echo $FOO # → hello
このように export
された変数だけが子シェルでも使えるようになります。
エクスポートするとは?
そもそもエクスポートするとはなんでしょうか。
export
は、変数を単なるローカル変数から「環境変数」に昇格させる操作です。
環境変数とは、プロセス間で共有できる設定情報のこと。たとえば PATH や LANG、EDITOR などのシステム環境に関わる変数がこれに該当します。
エクスポートすることで、コマンドやアプリケーションがそれらの変数を認識できるようになります。
エクスポートの情報はどこに保存される?
結論から言うと、エクスポートした情報はメモリ上に一時的に保持されているだけです。
そのため、シェルを閉じれば情報は消えてしまいますし、再度起動したときには再設定が必要になります。
これが「パスを通したのに翌日には戻ってる!」という現象の正体です。
毎回起動時に自動でexportされてるのはなぜ?
毎回起動時に自動でexportされる理由は、~/.bashrc
や ~/.zshrc
などの設定ファイルに export
文が書かれているからです。これらのファイルはターミナル起動時に自動d読み込まれます。
# ~/.zshrc の例
export PATH="$HOME/bin:$PATH"
ちなみに、設定ファイルを編集した直後に反映させたい場合は、以下のように source
コマンドを使います。
# 変更をすぐに反映したいとき
source ~/.zshrc # または source ~/.bashrc
この source
コマンドは、シェルを再起動せずに設定を再読み込みするための便利な手段です。
まとめ
-
PATH
はコマンドを探す場所のリスト -
$PATH
はその中身を参照する記号 -
export
は変数を子プロセスにも共有させる宣言 - パスを通すことでどこからでもコマンドが呼べる
- 永続化したいときは
.bashrc
や.zshrc
に書こう! -
source
コマンドで設定を即時反映できる - よくあるエラーもPATHの設定で解決できる
これらの知識が身につけば、シェル操作が一段と快適になります!