PATH を理解する
PATH を理解する とは
コマンド実行に不可欠な「PATH」について、その役割と設定方法をターミナルで理解します。本レッスンでは、PATH を理解する の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ重要か
ls と打ったら一覧が出る。python と打ったらインタプリタが起動する。なぜシェルはどこにあるかも知らせていない実行ファイルを見つけられるのでしょうか。答えは環境変数 PATH です。PATH はコロン区切りでディレクトリのリストを並べた値で、シェルはこのリストを先頭から順に走査して実行ファイルを探します。command not found の 9 割は PATH の理解で解決します。本レッスンでは PATH の中身を覗き、which type の使い方を整理し、新しいツールをインストールしたあとの確認手順を身につけます。
PATH の中身
コロンで区切られた検索パスです。先に出てくるディレクトリほど優先されます。
ターミナル
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin見やすく改行で並べたい場合は tr でコロンを改行に置換します。
ターミナル
echo $PATH | tr ':' '\n'図解 探索の流れ
シェルは見つかった最初の実行ファイルを採用します。複数の python が存在すると、PATH の前に来ているディレクトリの方が優先されるため、新旧バージョンを切り替える定番テクニックになります。
どのファイルが呼ばれるか確認する
ターミナル
which python # 実行ファイルの場所を返す
type python # alias / 関数 / built-in / 外部コマンドのどれか教えてくれる
type -a python # 候補をすべて表示 (PATH 上の全ヒット)
command -v python # 移植性の高い書き方PATH への追加
新しいツールを入れたら、PATH に登録しないと呼び出せません。シェル設定ファイルに次のような行を書きます。
ターミナル
# ~/.bashrc などに追記
export PATH="$HOME/.local/bin:$PATH"
export PATH="/opt/homebrew/bin:$PATH"先頭に追加すると優先度が上がり、末尾に追加すると標準ツールが優先されます。Python の venv や Node.js の nvm はまさにこの仕組みで python node のバージョンを切り替えています。
PATHを上書きするときに:$PATHを付け忘れると、シェルが既存のディレクトリを失いlsすら動かなくなります。export PATH=/opt/mytools/binではなく必ずexport PATH="/opt/mytools/bin:$PATH"の形で書くことを習慣化してください。
危険な PATH 設定
ターミナル
# 危険: カレントディレクトリを PATH に含める
export PATH=".:$PATH"カレントディレクトリ . を PATH に含めると、攻撃者が /tmp などに置いた偽の ls を踏む可能性があります。最近の Linux で PATH に . が含まれていないのはこの理由で、サーバ上では特に避けるのが鉄則です。
仕事で「コマンドが動かない」と聞いたら、まず
echo $PATHとwhich コマンド名を打つのが最初の一歩です。インストール先がパスに入っていないだけのケースが圧倒的に多く、5 秒で解決します。
バージョン切り替えツールとの相性
pyenv、rbenv、nvm、asdf、direnv のような「言語バージョン管理ツール」はすべて PATH を書き換えることで動いています。プロジェクトディレクトリに入ったら自動的に該当バージョンの python が PATH の先頭に並ぶ仕組みです。中身を理解しておくと「なぜか古いバージョンが呼ばれる」「shim とは何か」といったハマりに対処できます。
PATH のデバッグ手順
挙動がおかしいときの定番手順は次のとおりです。
ターミナル
echo $PATH # 値を確認
echo $PATH | tr ':' '\n' # 改行で並べて見やすく
which -a python # PATH 上で見つかった全候補を一覧
type python # alias か関数か外部コマンドか
ls -l $(command -v python) # 実体のシンボリックリンクを確認複数の Python が並んでいる場合、which -a と ls -l でリンク先までたどると、どのバージョンが採用されているかが必ず判明します。
似た変数たち
Linux にはコマンド検索系の PATH だけでなく、用途別の検索パスがいくつか存在します。
| 変数 | 用途 |
|---|---|
PATH | 実行ファイル検索 |
MANPATH | man のドキュメント検索 |
LD_LIBRARY_PATH | 動的リンクライブラリ検索 (要注意、誤設定でセキュリティリスク) |
PYTHONPATH | Python の import 検索 |
やってみよう
コース UI のサブシェルで echo $PATH を表示し、tr で改行に区切って先頭数件を眺めてみましょう。
まとめ
PATHはコロン区切りの検索パスで、先頭ほど優先されるwhichtypecommand -vでどのファイルが呼ばれるか確認できるPATHを書き換える際は必ず:$PATHを残す。先頭追加と末尾追加で優先度が変わる- カレントディレクトリ
.を含めるのはセキュリティ上の地雷 - 言語バージョン管理ツールは
PATHの操作で成り立っているため、仕組みを知ると応用が利く
次のレッスン
次は 環境設定チェック で、コマンド実行に不可欠な「PATH」について、その役割と設定方法をターミナルで理解します を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- PATH の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. PATH とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
課題
- $PATH を 1 行ずつに分割する
- head で件数を絞って出力する