「PATHを通す」とは何か?
サーバーの運営やプログラミングをやっていると「PATHを通す」という言葉が頻繁に出てくると思います。
ここでは、この「PATHを通す」なる謎の呪文がどういう意味で、「PATHを通す」と書かれてある時には何をすべきかを解説します。
スポンサーリンク
目次
PATHとコマンド
急いでいる人向けに説明すると、「PATHを通す」とはPATH環境変数に実行ファイルのあるディレクトリを追加する。という意味です。
これで意味のわかる方はブラウザバックして問題ありません。
さて、Javaを使用するときはjavaコマンドを実行すれば動きますね。これはなぜでしょうか?
Javaがインストールされているから?では、インストールさえされていれば何でもコマンドで実行できるのでしょうか?
そうではないでしょう。とくにGUIで動くソフトウェアはコマンドで指定しても「そんなコマンドはない」と表示されることが多いです。
この「コマンドから呼び出せる」「コマンドでは呼び出せない」の違いを生み出すのこそが、「PATHを通す」です。
環境変数
「PATHを通す」の「PATH」は環境変数と呼ばれるものです。
OSには最低限の設定や情報が入っている「環境変数」と呼ばれる特殊な変数があります。
この中で、「コマンドの入っているディレクトリ」を設定するのがPATHです。
実際の値を確認してみましょう。
# Bash
echo $PATH
# PowerShell
echo $env:PATH
REM cmd.exe
echo %PATH%
ディレクトリが表示されましたね?
何かコマンドを実行したときは、このPATHに入っているディレクトリから検索されるのです。
つまり、PATHにディレクトリを追加すると、その中にある実行ファイルがコマンドで実行できるようになるということです。
これが「コマンドから呼び出せる」「コマンドでは呼び出せない」の違いを生み出しているのです。
たとえば、実行ファイルが/foo/bar/bazにあるとして、このままではbazコマンドは実行できません。
そこでPATHに/foo/barを追加します。そうするとbazコマンドが実行できるようになるのです。
この設定を行う事を「PATHを通す」と言います。
PATHの通し方(Bash)
Bash環境(LinuxやmacOS)なら~/.bash_profileを変更して設定します。(シェルをBash以外に設定している人は……解説なんて要りませんよね?)
~/.bash_profileをエディターで開いて、次のように設定します。(ファイルが存在しない場合は作成しましょう)
export PATH=$PATH:ディレクトリ
# たとえば/foo/bar にPATHを通したいなら
export PATH=$PATH:/foo/bar
PATHにPATHを追加しているように見えて奇妙ですが、これはデフォルトのPATHを維持するために必要です。
これを忘れて、うっかり次のように書いてしまうと他のコマンドが実行できなくなって苦労します。
# ダメな例
export PATH=/foo/bar
ちなみに、ディレクトリはPATHの前に追加しても後に追加しても構いません。
# どちらでもOK
# 一般的なのはこちら
export PATH=$PATH:/foo/bar
# こちらはコマンドが重複する時用
export PATH=/foo/bar:$PATH
普通はPATHの後ろに追加するのが一般的です。
後述しますが、前にあるか後にあるかでコマンドが重複した時の挙動に影響します。
PATHを変更した後は~/.bash_profileを再読み込みする必要があります。Bash(ターミナル)を再起動するか、source ~/.bash_profileを実行します。
PATHの通し方(Windows)
Windowsはコントロールパネルから設定します。(コマンドからも設定できますが、上級者向けなのでここでは解説しません)
コントロールパネルからシステムを開き、画面左側にある「システムの詳細設定」をクリック。(「システム」はWindowsキー+Pauseでも開けます)
ちなみにですが、Windows 10であれば画面左下の検索枠に「システム環境変数の編集」とか「env」と入力するともっと簡単に開けます。
「詳細設定」から「環境変数」を選択。
「Path」を選択して「編集」(ちなみに、ユーザー環境変数とシステム環境変数のどちらのPathでも構いませんが、自分一人が使うだけであればユーザー環境変数で十分です)
「新規」で追加したり、必要に合わせて編集や削除を行いましょう。
コマンドが重複した時
PATHのディレクトリは先頭から検索されます。
たとえば/fooと/barの両方ともPATHが通っているとして、/foo/bazと/bar/bazがある状況でbazコマンドを実行すると、先に指定されているコマンドが実行されます。
PATHが/foo;/barなら先に指定されているのは/fooなので/foo/bazが実行されます。もちろん/barが先に指定されているのなら/bar/bazが実行されます。
普段は気にしなくても構いませんが、意図しているものと違うコマンドが実行されるときには思い出してみてください。
PATHの小ネタ
PATHに関する小ネタをいくつか。
$HOME/binにPATHを通す
Linuxなどであれば$HOME/bin(~/binと表記されることもある)、Windowsであれば%USERPROFILE%\binにPATHを通すというテクニックがあります。
こうすれば、ホームディレクトリ(/home/ユーザー名やC:\Users\ユーザー名)のbinディレクトリにPATHが通った状態になります。
これの何が便利かというと、自作のスクリプトや、わざわざPATHを個別に設定するほどでもないもの(単一の実行ファイルだけで提供されるソフトウェア)などを放り込むだけでコマンドから呼び出せるようになる事です。
自分だけが使うツールのためにいちいち管理者権限の必要なディレクトリを触ったり、環境変数を変更する必要がなくなります。
(もちろんディレクトリ名はbin以外でも構いませんが、一般的なのはbinです)
PATHを通さない
一度しか使わないコマンドのためにPATHを通すのは面倒です。PATHを通さずにコマンドを呼び出す方法はないのでしょうか?
もちろんあります。ディレクトリも指定して実行しましょう。
たとえば、/foo/bar/bazに実行ファイルがあるとして、このbazをPATHを通さずに呼び出すには/foo/bar/bazのように指定します。
もちろんこの/foo/barの部分は有効なディレクトリ指定なら何でもよくて、カレントディレクトリが/foo/barなら./bazでOKですし、/foo/hogeなら../bar/bazでOKです。
うっかり間違えてPATHの設定を失敗したとしても、この方法でエディターを起動すれば復旧できます。
もう1つ、PATHを通さずに実行する方法として、シンボリックリンクがあります。
すでにPATHが通っている場所にコマンドのシンボリックリンクを作成します。
たとえば$HOME/binにPATHが通っているのなら、$HOME/bin/bazに/foo/bar/bazへのシンボリックリンクを追加するのです。
こうすれば、$HOME/binはPATHが通っているのですから、bazでコマンドを実行できます。
シンボリックリンクの類型として、ラッパースクリプトもあります。
$HOME/bin/bazに次のような、引数などをそのままに他のコマンドへ渡すだけのスクリプトを作成します。
#!/bin/sh
# Bash
/foo/bar/baz "$@"
exit $?
@echo off
REM Windows
/foo/bar/baz %*
こうすれば、bazで$HOME/bin/bazが呼び出され、これらのスクリプトから/foo/bar/bazが実行されます。
先ほど紹介した$HOME/binはこういう用途にも役立ちますよ。
実際の場所を探す
あるコマンドがどこにあるかを調べるためには、Bashであればwhich、PowerShellであればgcm(Get-Commandと同じ)、cmd.exeであればwhereを使用します。
which command
gcm command
where command
「フルパスで指定しなければならない」という状況はチラホラあるので、覚えておきましょう。