新しいCLIツールを入れた直後にコマンドを叩くと、command not found が返ってくることがあります。
調べるとたいてい「PATHを通してください」と書いてあるものの、この「通す」が何をしているのかは意外と説明されません。
本記事では、環境変数PATHの仕組みと「通す」操作の中身、やりがちな失敗までをまとめて整理します。
PATHは「コマンドを探す場所のリスト」
PATHは環境変数の一つで、実行ファイルを探しに行くディレクトリをコロン区切りで並べたリストです。
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
コマンド名だけを打ったとき、シェルはこのリストを左から順に見ていきます。
最初に見つかった実行ファイルを実行して、探索はそこで打ち切り。
リストのどこにも見つからなかったときに返ってくるのが、あの command not found です。
見つかった場所は type で確認できる
実際にどのディレクトリのものが使われるかは、type コマンドで確認できます。
$ type python3
python3 is /usr/bin/python3
「入れたはずのツールと違う場所のものが動いていた」というケースも、これで一発で分かります。
「PATHを通す」の実体は、リストへの追記
「通す」と言っても、実体は環境変数PATHの末尾にディレクトリを1つ足しているだけです。
export PATH="$PATH:/opt/mytool/bin"
$PATH で現在のリストを展開し、その後ろに新しいディレクトリをつなげて再代入しています。
これでシェルの検索対象に /opt/mytool/bin が加わり、中の実行ファイルをコマンド名だけで呼べるようになるのです。
export は「子プロセスにも渡す」という宣言
export を付けた変数は、シェル自身だけでなく、シェルから起動される子プロセスにも引き継がれます。
打ったコマンドはシェルの子プロセスとして動くので、export されていない変数は向こう側に届きません。
PATHは最初から export 済みのため再代入だけでも動きますが、export を付けて書くのが定番の作法です。
そのままでは「そのシェル限り」
ターミナルで打った export は、そのシェルを閉じた時点で消えます。
毎回使うツールなら、~/.bashrc や ~/.zshrc に同じ1行を書いて永続化するのが定石。
反映されるのは新しく開いたシェルからで、今のシェルに効かせたいときは source ~/.bashrc を打ちます。
やりがちな失敗3つ
$PATH を忘れて上書きする
一番危ないのがこれで、export PATH=”/opt/mytool/bin” のように書くと検索リスト全体が置き換わってしまうのです。
ls や cat のような基本コマンドまで見つからなくなるので、シェルが壊れたように見えて焦るはず。
永続化する前ならターミナルを開き直せば元に戻るので、まずは落ち着いてそのシェルを閉じるのが正解です。
先頭に足すか、末尾に足すか
同名のコマンドが複数の場所にあるときは、リストの左にある方が勝ちます。
別バージョンを優先させたいときだけ export PATH=”/opt/newver/bin:$PATH” のように先頭へ、迷ったら末尾が無難です。
.bashrc に書いたのに反映されない
~/.bashrc が読まれるのは新しいシェルの起動時なので、書いただけでは今の画面に反映されません。
source するか、新しいタブを開くか、どちらかを挟む必要があります。
さらに言うと、cron や GUI アプリはログインシェルとは別のPATHを見ていることがあり、自動化まわりでハマりやすいポイントです。
コマンドラインつながりで、JSONを整形・抽出する jq の入門記事も書いています。
最後に
PATHは「コマンドを探す場所のリスト」、通すはそのリストへの追記、export は子プロセスへ渡す宣言、と押さえればたいていの場面で困りません。
正式な定義は Bash Reference Manual(Bourne Shell Variables) にまとまっているので、深掘りしたい方はそちらもどうぞ。
以上です。









コメントを残す