いろいろなところで詰まりがちなねこだくさんです。
このPATHを通すという作業、環境構築する際に言われるがままに意味もわからずやっていました。
なるほど(わからん)からチョットワカルになる程度まで勉強してみたいと思います。
おやくそく
コマンド行の頭についている$はプロンプトを表しているだけなのでまるごとコピペするとエラーになります。
$ echo $PATH
↓
echo $PATH
※環境変数の頭の$は削っちゃダメ
まずPATHって何
本来なら/bin/lsのように長いパス(長くないけど)をフルパスといますが、これをいちいち打っていたのではめんどくさいです。
lsと打つだけでコマンド発行するために「コマンドサーチパス」を設定することをパスを通すといいます。
全然意味わかりませんね。実際に仮想環境Envaderを利用してやってみます。
PATHの確認
まず$PATHってのは環境変数です。
環境変数って何?
OSが動いているときに使える変数のこと。
OS上の様々なプログラムやコマンドから使用することができます。
※プログラムの中で環境変数を変更した場合はそのプログラムを実行しているときのみ影響します。
続きです。
echoコマンドで$PATHを指定すると指定されているPATHが表示されます。
$ echo $PATH
/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games
それぞれのPATHは:で区切られていることがわかります。
whichコマンド
あれ?lsコマンドのフルパスってなんだっけ?というような場合、whichコマンドとコマンド名を指定することでそのコマンドのフルパスを表示します。
実行ファイルの場所を示しています。
$ which ls
/bin/ls
※オプションに-aをつけることでエイリアスを含む全てのパスを表示します。
いよいよPATHを通します
exportというコマンドを使用してPATHを通します。
export PATH=$PATH:/home/test
# echoコマンドで確認
echo $PATH
/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/test
コード参考:PATHの使い方
末尾に'/home/test'が追加されました。
これでこのディレクトリにあるシェルスクリプトが認識されコマンドとして実行できるようになります。
※exportコマンド自体は環境変数やシェル変数を設定するものです。
【2026-08-15 追記】whichの説明の訂正と、exportが消える件
ここから下は2026年8月のterralienが後から足した追記です。当時の本文は直していません。この記事はPATHの通し方としては合っているのですが、読んだ人が実際にやると高確率でハマる穴が2つ空いていたので埋めます。
訂正: which -aはエイリアスを出しません
本文は「オプションに-aをつけることでエイリアスを含む全てのパスを表示します」と書いていますが、間違いです。-aはPATHの中に同名の実行ファイルが複数あるとき、それを全部出すオプションです。エイリアスは関係ありません。
そもそも/usr/bin/whichは外部コマンドなので、シェルの中にしか存在しないエイリアス・シェル関数・ビルトインは原理的に見えません。これが地味に効きます。
$ alias ls='ls --color=auto'
$ which ls
/bin/ls # ← エイリアスは見えていない。実際に走るのはエイリアスのほう
$ type ls
ls is aliased to `ls --color=auto' # ← シェルに聞けば分かる
「whichで出たパスと、実際に実行されるもの」は一致しないことがあります。「whichで見たのにオプションの挙動が違う」というハマり方をしたら、だいたいエイリアスかシェル関数です。
| コマンド | 正体 | エイリアス/関数が見えるか |
|---|---|---|
which |
外部コマンド(zshではビルトイン) | 見えない |
type |
シェルビルトイン | 見える(種類も答える) |
command -v |
シェルビルトイン・POSIX規定 | 見える(スクリプト向き) |
ちなみにDebianは2021年にwhichを非推奨にしてdebianutilsから消そうとし、実行するたび警告を出すようにしました。これは反発を受けて技術委員会が判断し、警告のほうを削除・whichは残すことで決着しています。とはいえPOSIXにあるのはcommand -vのほうなので、スクリプトに書くならこちらが安全です。
# スクリプトで「そのコマンドが入っているか」を調べる定番
if command -v docker >/dev/null 2>&1; then
echo "dockerあります"
fi
本文のexportは、ターミナルを閉じると消えます
本文はexport PATH=$PATH:/home/testで「PATHを通しました」と書いて終わっていますが、これは今開いているシェルの中だけの話です。ターミナルを閉じたら元に戻ります。残したいなら設定ファイルに書きます。
| シェル | 書き足す先 |
|---|---|
| bash | ~/.bashrc(ログインシェルなら~/.bash_profile) |
| zsh(macOSの既定) | ~/.zshrc |
書くときは必ず$PATHを含めること。 export PATH=/home/testのように$PATH:を落として書くと、それまでのPATHを全部捨てて上書きします。lsもviも見つからないシェルができあがり、しかも設定ファイルに書いてあるので開き直しても直りません。その場は/bin/vi ~/.bashrcのようにフルパスで叩けば復旧できます。
あとPATHは前に書いたものが優先されます。同名のコマンドが複数あるとき、どれが勝つかはこの順番で決まります(which -aが本来出すのがこの一覧です)。
export PATH=/home/test:$PATH # 自分のものを優先したいとき(前に置く)
export PATH=$PATH:/home/test # システムを優先したいとき(後ろに置く・本文はこちら)
【2026-08-15 追記ぶんの出典】POSIX.1-2017 — command(command -vが標準であること)/bash(1) - Linux manual page(SHELL BUILTIN COMMANDS の節・typeの挙動)/Debian's which hunt(LWN.net)とDebian技術委員会の結論(Bug#994275)(非推奨警告を削除しwhichを残した経緯)
PATHを通すとは
- 環境変数にコマンドを探すパスを設定することでコマンドを実行することができるようにすること。
- コマンドのフルパスを調べるにはwhich
謎の儀式からそういう作業であるという認識にレベルアップしました。
猫たちはそのへんで転がっています。
が、今日のところは公園で撮った桜を上げときます。

参考資料



