PATHを通すとは?

PATHを通すとは?

PATHを通すことの理解が曖昧だったので、こちらでまとめさせていただきました

現在、下記のようにHOMEディレクトリ(/Users/higmonta)の下に[path_test]というディレクトリを作成し、[path_test]ディレクトリの下に[abcd]というファイルを作成している。

higmonta@higuchimiyukiyuunoMacBook-Pro path_test % pwd
/Users/higmonta/path_test
higmonta@higuchimiyukiyuunoMacBook-Pro path_test % ls
abcd

今回試したい事は、ターミナルで[abcd]というコマンドを使えるようにしたい。
[abcd]コマンドを実行できるようにするという事は、[abcd]ファイルに記載されているプログラムを実行するという事。
/Users/higmonta/path_test/abcdの下に存在するpath_testディレクトリの下に存在するabcdファイル)が存在する状況で、ターミナルで以下のように実行する。

higmonta@higuchimiyukiyuunoMacBook-Pro path_test % abcd
zsh: command not found: abcd      # abcdなんていうコマンド知らないよと言われている(abcdというファイル知らないよ)
higmonta@higuchimiyukiyuunoMacBook-Pro path_test % which abcd     # abcdというファイルの場所なんて知らないよと言われている
abcd not found

これは、PATHが通っていないために起こる

ターミナルで下記のようにディレクトリ直下のディレクトリやファイル一覧を表示する[ls]コマンドも[ls]というファイルがあり、PATHが通っている事でターミナルで[ls]コマンドを打つと[ls]ファイルのプログラムが実行されることで使えている

higmonta@higuchimiyukiyuunoMacBook-Pro path_test % ls
abcd
higmonta@higuchimiyukiyuunoMacBook-Pro path_test % which ls
/bin/ls     # ルートディレクトリ下のbinディレクトリの下にあるlsファイル

今回の[abcd]というファイルのプログラムをターミナルで[abcd]とコマンドを打つことで、実行できるようにする為には、PATHを通さなければいけない。

PATHの確認は、$PATHという環境変数の中に現在設定されているPATHの一覧が格納されている
ターミナルで[echo]を使うと変数の中身が確認できるので、以下のようにターミナルで実行して現在設定されているPATHの一覧を確認する

higmonta@higuchimiyukiyuunoMacBook-Pro path_test % echo $PATH
/Users/higmonta/.rbenv/shims:/Users/higmonta/.nodenv/shims:/Users/higmonta/.nodenv/bin:/usr/local/opt/openssl@1.1/bin:/usr/local/opt/mysql@5.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

上記を確認すると[abcd]コマンドを使うための、[/Users/higmonta/path_test]というパスが設定されていないので、環境変数に値を追加することでパスを設定する

パスの設定コマンドは、以下のようになる。

$ export PATH=$PATH:(追加したいパス)

下記コマンドで[/Users/higmonta/path_test]というパスを追加する

$ higmonta@higuchimiyukiyuunoMacBook-Pro path_test % pwd
/Users/higmonta/path_test

$ higmonta@higuchimiyukiyuunoMacBook-Pro path_test % export PATH=$PATH:/Users/higmonta/path_test    # [/Users/higmonta/path_test]というのは、上記のようにpath_testディレクトリでpwdをしたパスをそのまま記載している

上記コマンドでパスが通っているはずなので、下記コマンドでパスを確認する

higmonta@higuchimiyukiyuunoMacBook-Pro path_test % echo $PATH
/Users/higmonta/.rbenv/shims:/Users/higmonta/.nodenv/shims:/Users/higmonta/.nodenv/bin:/usr/local/opt/openssl@1.1/bin:/usr/local/opt/mysql@5.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/higmonta/path_test:/Users/higmonta/path_test

上記からも分かるように1番最後に[/Users/higmonta/path_test]という記述があり、パスが通った!!

この状況でターミナルで[abcd]コマンドを打って実行すると、最初のように[abcd]というコマンドなど知らないとエラーが出ない。

higmonta@higuchimiyukiyuunoMacBook-Pro path_test % abcd
zsh: permission denied: abcd      #  このメッセージは、パスが通っていない事とは別なメッセージなので今回の実験では気にしなくてOK(気になる場合は、分かりやすい記事が合ったので参考記事を参照して下さい)

これでパスが通ったが、ターミナルを終了して再度ターミナルを起動すると以下のようにまた[abcd]コマンドが使えなくなった

higmonta@higuchimiyukiyuunoMacBook-Pro ~ % abcd
zsh: command not found: abcd

これは、パスを設定してもそのパスがどこにも保存されていない為、ターミナルを消すとリセットされる為である。
設定したパスを半永久的に使えるようにする為には、シェルファイルにパスを保存する必要がある。
なぜシェルファイルに保存すると毎回パスがリセットされる事なく使えるようになるかというと、PCを起動してユーザーがPCにログインした後に必ずシェルファイルの処理を通るからである。
シェルファイルには、bashzshなど種類がいくつかあるが今回は、zshrcファイルを利用する。
シェルファイルは、下記のようにHOMEディレクトリの下にある。
zshrc(シェルファイル)のような重要なファイルは、.が付いて隠しファイルになっているので、通常通り[ls]でやってもファイルが出てこないので、[-a]オプションを付けて隠しファイルを表示する。

higmonta@higuchimiyukiyuunoMacBook-Pro ~ % ls -a
.zshrc


[-a]オプション: 隠しファイルを含めて全部のファイルやディレクトリを表示
[-l]オプション: 表示されるファイルやディレクトリの権限などの詳細を表示(隠しファイルは、表示されない)
[-la]オプション: 隠しファイルを含めて全部のファイルやディレクトリの権限などの詳細を表示

vimを使って[.zshrc]ファイルを開きパスを追加する。
以下を参照

higmonta@higuchimiyukiyuunoMacBook-Pro ~ % vi .zshrc


開いた[.zshrc]ファイルに以下のように記述

export PATH=$PATH:/Users/higmonta/path_test 

higmonta@higuchimiyukiyuunoMacBook-Pro ~ % echo $PATH
/Users/higmonta/.rbenv/shims:/Users/higmonta/.nodenv/shims:/Users/higmonta/.nodenv/bin:/usr/local/opt/openssl@1.1/bin:/usr/local/opt/mysql@5.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
higmonta@higuchimiyukiyuunoMacBook-Pro ~ % abcd
zsh: command not found: abcd

上記のように設定されているパスを確認しても表示されず、abcdコマンドを実行してもabcdコマンドを知らないと言われるのは、シェルに記載した内容を反映させる為には、1度ターミナルを終了してターミナルを再起動しなければいけないからである
ターミナルを再起動して、下記のように実行するとabcdコマンドが実行される。

higmonta@higuchimiyukiyuunoMacBook-Pro ~ % abcd
zsh: permission denied: abcd

※豆知識
ターミナルで下記コマンドを打つと現在いるディレクトリ以下に指定したファイルと、そのファイルの中身を指定して作成できる

$ echo "(ファイルの中身の内容)" >  (ファイル名)

参考記事:

www.youtube.com

www.youtube.com

www.youtube.com

permission deniedで悩まされたので勉強してみた - Qiita