30代後半、未経験からIT業界のエンジニア転職へ挑戦している、kobakichiです。
今回は、PATHを通す、の意味とその使い方について学んだので、自分なりにまとめようと思います。
正直今まで、PATHとは何か?PATHを通すとは何なのか?について何となく、フワッとした理解しかなかったので、Envaderを通して理解を深める事ができました。
初めに
今回学習するにあたり利用したのは、環境構築が不要で、オンラインでLinuxが学べる学習サービス、Envaderを利用しました。
Envader
について気になる方がいましたら、リンクを貼っておきますので参考までにどうぞ。
PATHとは
Linux環境を触っていると、絶対に避けて通れないのがこのPATH
についての理解だと思っています。
相対パスや絶対パスなどもありますが、今回のPATH
については環境変数に設定されているPATH
の事です。
この環境変数PATH
が何を意味しているのかですが、シェルがコマンドを実行する際にコマンドの実行ファイルを探しにいくための道筋と順番を示しています。
ls
とコマンドを叩くとカレントディレクトリにあるファイルが表示されますが、裏側ではこのPATH
に記載されている道筋と順番を見ながらls
コマンドのパスを探しに行って、その実行ファイルを実行してくれている事になります。
こちらの記事がすごい分かりやすかったです。
PATHを通すとは? (Mac OS X)
PATHを実際に見てみる。
環境変数PATH
を確認するには、echo $PATH
で表示させる事ができます。
envader@172-19-1-2:~$ echo $PATH/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
これが環境変数PATH
に登録されている、コマンドを実行するときに探しに行くパスの順番と道筋になります。
これをコマンド検索パスとも表現できるそうです。
パスの表示は:
で一区切りになっているので、上記をもう少し見やすくすると下記のように分解してみる事ができます。
/sbin #最初にコマンドを探すのはここ
/usr/sbin #なければここを探す
/usr/local/bin #なければここ
/usr/bin #下に続く
/bin
/usr/local/games
/usr/games
こうすると少し分かりやすいかなと思います。
コマンドを叩いたら、シェルがこの上から順番にそのコマンドの実行ファイルがある場所まで探しに行く。というシステムなんですね!
コマンド実行ファイルがどこにあるのかの確認方法
実際にls
と叩いた際に、PATH
に登録されているコマンド検索パスをシェルが探しにいくのですが、実際にコマンドの実行ファイルがどこに格納されているのか見てみましょう。
確認するには、which
コマンドを使用します。
envader@172-19-1-2:~$ which ls
/bin/ls
これがls
コマンドの実行ファイルが格納されているパスになります。
ls
と叩くと、シェルがこの/bin/ls
までファイルを検索して実行している。という事になりますね。
ちなみにこの/bin
ディレクトリの中身を確認してみると、たくさんのコマンドが格納されていました。
envader@172-19-1-2:/bin$ ls
bash dmesg gzip mount rmdir tempfile zcmp
cat dnsdomainname hostname mountpoint run-parts touch zdiff
chgrp domainname kill mv sed true zegrep
chmod echo ln nisdomainname sh umount zfgrep
chown egrep login original sh.distrib uname zforce
cp false ls pidof sleep uncompress zgrep
dash fgrep lsblk ps stty vdir zless
date findmnt mkdir pwd su wdctl zmore
dd grep mknod rbash sync which znew
df gunzip mktemp readlink tailf ypdomainname
dir gzexe more rm tar zcat
こんな感じで、各コマンドを叩くとPATH
に書いてあるコマンド検索パスを通じて、コマンドの実行ファイルを探しに行く。という事なんですね〜。
注意点
コマンド検索パスには優先順位があり、もしも同じ名前のコマンド実行ファイルが複数のコマンド検索パスに存在していた場合にはPATH
に書いてある左側から順番に実行されるそうです。
echo $PATH/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
これだと/sbin
から順番に実行されるという事ですね。
/sbin
と/usr/sbin
に同じ名前の実行ファイルがあった場合には、/sbin
が実行されるため、注意が必要です。
なんかうまくいかないな〜、と言った場合にはパスの優先度が原因のときもあるそうなので、細かいところですがこう言った順番を頭に入れておくのも必要ですね。
PATHを追加してみる。
コマンド検索パスを追加したい!となった場合には、export
コマンドを使用します。
一度echo $PATH
で現在のコマンド検索パスを再度表示してみます。
envader@172-19-8-2:~$ echo $PATH
/bin/original/:/sbin:/usr/sbin:/usr/local
/bin:/usr/bin:/bin:/usr/local/games:/usr/games
次に、export
コマンドを使用して、/home/sample
のPATHを通します。
export
コマンドを使用することで、
- 環境変数を表示する事
- 環境変数を設定する事
- 環境変数を削除する事
ができるようになります。
コマンドサンプル
export PATH=$PATH:追加したいコマンド検索パス
#こちらのやり方でも同じ意味になります。少し大変ですが。
export PATH=/bin/original:/sbin:/usr/sbin:/usr/local
/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/sample
実際にやってみると下のようになります。
envader@172-19-8-2:~$ export PATH=$PATH:/home/sample
再度echo $PATH
で追加されているか確認します。
envader@172-19-8-2:~$ echo $PATH
/bin/original:/sbin:/usr/sbin:/usr/local
/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/sample
末尾に/home/sample
が追加されていますね。
コマンド検索パスの順番を変更しながらPATHを追加する
先ほどもご紹介しましたが、コマンド検索パスには優先順位があり、PATH
に記述されている左側から順にコマンドを探しにいきます。
なので、追加するパスの優先順位を上げたい時には以下のように書く事で、優先順位を上げてPATH
に記述する事ができます。
export PATH=追加したいコマンドパス:$PATH
実際にやってみましょう。
envader@172-19-2-2:~$ export PATH=/usr/sample:$PATH
envader@172-19-2-2:~$ echo $PATH
/usr/sample:/bin/original:/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
ちゃんと指定した/usr/sample
が最初に追加されているのが分かりますね!
まとめ
今回はEnvaderを使用して、PATHについての理解を深めました。
- 環境変数
PATH
とは、コマンド検索パスとも表現でき、シェルがコマンドを実行する際にコマンドの実行ファイルを探しに行くための道筋と順番を表している。 - コマンドを実行するときには、コマンド検索パスに記述されている左側から順に検索され、実行される。
-
export
コマンドを使って、環境変数を表示、設定、削除する事ができる。
最後まで読んでいただきありがとうございました。
参考にさせていただいた記事一覧
PATHを通すために環境変数の設定を理解する (Mac OS X)