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'

図解 探索の流れ

diagram (will load when visible)

シェルは見つかった最初の実行ファイルを採用します。複数の 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 $PATHwhich コマンド名 を打つのが最初の一歩です。インストール先がパスに入っていないだけのケースが圧倒的に多く、5 秒で解決します。

バージョン切り替えツールとの相性

pyenv、rbenv、nvm、asdf、direnv のような「言語バージョン管理ツール」はすべて PATH を書き換えることで動いています。プロジェクトディレクトリに入ったら自動的に該当バージョンの pythonPATH の先頭に並ぶ仕組みです。中身を理解しておくと「なぜか古いバージョンが呼ばれる」「shim とは何か」といったハマりに対処できます。

PATH のデバッグ手順

挙動がおかしいときの定番手順は次のとおりです。

ターミナル

echo $PATH # 値を確認 echo $PATH | tr ':' '\n' # 改行で並べて見やすく which -a python # PATH 上で見つかった全候補を一覧 type python # alias か関数か外部コマンドか ls -l $(command -v python) # 実体のシンボリックリンクを確認

複数の Python が並んでいる場合、which -als -l でリンク先までたどると、どのバージョンが採用されているかが必ず判明します。

似た変数たち

Linux にはコマンド検索系の PATH だけでなく、用途別の検索パスがいくつか存在します。

変数用途
PATH実行ファイル検索
MANPATHman のドキュメント検索
LD_LIBRARY_PATH動的リンクライブラリ検索 (要注意、誤設定でセキュリティリスク)
PYTHONPATHPython の import 検索

やってみよう

コース UI のサブシェルで echo $PATH を表示し、tr で改行に区切って先頭数件を眺めてみましょう。

まとめ

  • PATH はコロン区切りの検索パスで、先頭ほど優先される
  • which type command -v でどのファイルが呼ばれるか確認できる
  • PATH を書き換える際は必ず :$PATH を残す。先頭追加と末尾追加で優先度が変わる
  • カレントディレクトリ . を含めるのはセキュリティ上の地雷
  • 言語バージョン管理ツールは PATH の操作で成り立っているため、仕組みを知ると応用が利く

次のレッスン

次は 環境設定チェック で、コマンド実行に不可欠な「PATH」について、その役割と設定方法をターミナルで理解します を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. PATH の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. PATH とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

課題

  1. $PATH を 1 行ずつに分割する
  2. head で件数を絞って出力する

ヒント

script.sh
script.sh
学習モード
script.sh
ターミナル出力