今日、友人と PATH にディレクトリを追加する方法について話しました。 ターミナルを長年使っているので私にとっては「当たり前」に感じることですが、 やり方の説明を探してみると、すべての手順を説明しているものが見つかりませんでした。 多くの記事では「~/.bashrc にこれを追加してください」と書かれていますが、 bash を使っていない場合はどうすればよいのでしょうか? また、bash の設定ファイルが別の場所にある場合はどうでしょうか? そして、どのディレクトリを追加すればよいのか、どうやって調べればよいのでしょうか?

そこで、もう少し完全な手順と、これまでにつまずいた注意点を書き留めてみようと思いました。

目次は以下の通りです:

手順 1: 使用しているシェルを確認する

使用しているシェルがわからない場合は、以下のコマンドを実行してください:

ps -p $$ -o pid,comm=
  • bash を使用している場合:97295 bash と表示されます
  • zsh を使用している場合:97295 zsh と表示されます
  • fish を使用している場合:「In fish, please use $fish_pid」のようなエラーが表示されます($$ は fish では無効な構文ですが、エラーメッセージで fish を使用していることがわかります)

また、Linux では bash が、Mac OS(2024年現在)では zsh がデフォルトです。 ここでは bash、zsh、fish のみを扱います。

手順 2: シェルの設定ファイルを見つける

  • zsh の場合:おそらく ~/.zshrc
  • bash の場合:~/.bashrc の可能性がありますが、複雑なので次のセクションの注意を参照してください
  • fish の場合:おそらく ~/.config/fish/config.fish(確実に知りたい場合は echo $__fish_config_dir を実行してください)

bash の設定ファイルに関する注意

Bash には ~/.bashrc~/.bash_profile~/.profile の 3 つの設定ファイルがあります。

システムがどのファイルを使用しているかわからない場合は、以下の方法でテストすることをおすすめします:

  1. ~/.bashrcecho hi there を追加する
  2. ターミナルを再起動する
  3. 「hi there」と表示されたら、~/.bashrc が使用されています!
  4. 表示されない場合は削除して、~/.bash_profile で同じことを試す
  5. 上記の 2 つでうまくいかない場合は ~/.profile も試せます

(bash がどの設定ファイルを使用するかを説明した詳細なフローチャートはたくさんありますが、覚える価値はなく、テストするのが最も確実で速い方法です)

手順 3: 追加するディレクトリを特定する

http-server というプログラムをインストールして実行しようとしたが、以下のようにうまくいかないとします:

$ npm install -g http-server
$ http-server
bash: http-server: command not found

http-server がどのディレクトリにあるか調べるにはどうすればよいでしょうか? 一般的にこれは簡単ではありません。npm の設定方法によって異なることが多いです。いくつかの方法:

  • 新しいインストーラー(cargonpmhomebrew など)を最初に設定するときに、PATH の更新方法が表示されることがあります。注意していればその時点でわかります。
  • インストーラーが自動的にシェルの設定ファイルを更新して PATH を更新してくれる場合があります
  • 「where does npm install things?」で検索すると答えが見つかることがあります
  • インストール先の設定を確認できるサブコマンドがあるツールもあります:
    • Node/npm: npm config get prefix(その後に /bin/ を追加)
    • Go: go env GOPATH(その後に /bin/ を追加)
    • asdf: asdf info | grep ASDF_DIR(その後に /bin//shims/ を追加)

手順 3.1: 正しいディレクトリであることを確認する

正しいと思われるディレクトリが見つかったら、実際に正しいか確認しましょう! 私のマシンでは http-server~/.npm-global/bin にあることがわかりました。 そのディレクトリで http-server を実行して確認できます:

$ ~/.npm-global/bin/http-server
Starting up http-server, serving ./public

実行できました!追加するディレクトリがわかったので、次の手順に進みましょう。

手順 4: シェルの設定を編集する

ここで必要な 2 つの重要な情報が揃いました:

  1. PATH に追加したいディレクトリ(例: ~/.npm-global/bin/
  2. シェルの設定ファイルの場所(例: ~/.bashrc~/.zshrc~/.config/fish/config.fish

追加する内容はシェルによって異なります:

bash の手順:

シェルの設定ファイルを開き、以下のような行を追加します:

export PATH=$PATH:~/.npm-global/bin/

~/.npm-global/bin は実際に追加したいディレクトリに置き換えてください)

zsh の手順:

bash と同じ方法でもできますが、zsh には少し高度な構文もあります:

path=(
  $path
  ~/.npm-global/bin
)

fish の手順:

fish では構文が異なります:

set PATH $PATH ~/.npm-global/bin

(fish では fish_add_path も使えます。詳細は下記を参照)

手順 5: シェルを再起動する

非常に重要な手順です:シェルの設定を更新しても、再起動しないと反映されません!

2 つの方法があります:

  1. 新しいターミナル(またはタブ)を開き、古いターミナルを閉じて混乱を避ける
  2. bash(zsh の場合は zsh、fish の場合は fish)を実行して新しいシェルを起動する

どちらの方法も通常は問題なく動作します。

これで完了です!実行しようとしていたプログラムを試してみてください。うまくいけば動作するはずです。

うまくいかない場合は、以下のような問題が考えられます:

問題 1: 間違ったプログラムが実行される

プログラムのバージョンが間違っている場合は、PATH の末尾ではなく先頭にディレクトリを追加する必要があります。

例えば、私のシステムには 2 つのバージョンの python3 がインストールされており、which -a で確認できます:

$ which -a python3
/usr/bin/python3
/opt/homebrew/bin/python3

シェルが使用するのは最初に表示されたものです。

Homebrew 版を使用したい場合は、そのディレクトリ(/opt/homebrew/bin)を PATH の先頭に追加する必要があります(通常の $PATH:/opt/homebrew/bin/ ではなく /opt/homebrew/bin/:$PATH):

export PATH=/opt/homebrew/bin/:$PATH

または fish の場合:

set PATH ~/.cargo/bin $PATH

問題 2: プログラムがシェルから実行されていない

これらの手順は、プログラムをシェルから実行する場合にのみ有効です。 IDE、GUI、cron ジョブなどから実行する場合は、別の方法で PATH にディレクトリを追加する必要があります。詳細は状況によって異なります。

cron ジョブの場合

いくつかの方法:

  • プログラムのフルパスを使用する(例: /home/bork/bin/my-program
  • crontab の最初の行に使用したいフル PATH を指定する(例: PATH=/bin:/usr/bin:/usr/local/bin:…)。シェルで使用しているフル PATH は echo "PATH=$PATH" で確認できます。

IDE/GUI の扱い方については、最近遭遇していないためわかりません。情報があれば追記します。

問題 3: PATH の重複エントリでデバッグが困難になる

bash(または zshfish)を実行して新しいシェルを起動すると、シェルが起動するたびに新しいエントリを PATH に追加するため、重複した PATH エントリが発生することがよくあります。

個人的には、このような重複が問題を引き起こしたことはありませんが、PATH の内容を理解しようとする際にデバッグが難しくなります。

対処法:

  1. PATH をデバッグする場合は、新しいターミナルで作業して「クリーン」な状態にする。これで重複を避けられます。
  2. シェルの設定ファイルの末尾で PATH の重複を解除する(例: zsh では typeset -U path で可能)
  3. 追加する前にディレクトリが既に PATH に含まれていないか確認する(例: fish では fish_add_path --path /some/directory で可能)

PATH の重複解除方法はシェル固有で、組み込みの方法がない場合もあるため、各自のシェルで調べる必要があります。

問題 4: PATH 更新後に履歴が失われる

bash や zsh で陥りやすい状況:

  1. コマンドを実行する(失敗する)
  2. PATH を更新する
  3. bash を実行して設定を再読み込みする
  4. 上矢印キーを何度か押して失敗したコマンドを再実行する(または新しいターミナルを開く)
  5. 失敗したコマンドが履歴にない!なぜ?

これは bash ではデフォルトで、シェルを終了するまで履歴が保存されないためです。

対処法:

  • bash を実行して設定を再読み込みする代わりに、source ~/.bashrc(zsh の場合は source ~/.zshrc)を実行する。これで現在のセッション内で設定を再読み込みできます。
  • シェル終了時だけでなく、継続的に履歴を保存するよう設定する(bash か zsh かによって方法が異なり、zsh の履歴オプションは複雑です)

source コマンドに関する注意

cargo(Rust のインストーラー)を初めてインストールすると、特定のディレクトリを指定しない以下のような指示が表示されます:

This is usually done by running one of the following (note the leading DOT):

. "$HOME/.cargo/env"        	# For sh/bash/zsh/ash/dash/pdksh
source "$HOME/.cargo/env.fish"  # For fish

シェルの設定ファイルにこの行を追加すると、スクリプトが自動的に PATH(およびその他の設定)を行ってくれます。

これは一般的です(例: Homebrewbrew shellenv の eval を推奨)。アプローチは 2 つあります:

  1. ツールの指示通りにする(例: . "$HOME/.cargo/env" をシェルの設定に追加)
  2. スクリプトが PATH に追加するディレクトリを特定し、手動で追加する。手順:
    • シェルで . "$HOME/.cargo/env" を実行する(fish の場合は fish 版)
    • echo "$PATH" | tr ':' '\n' | grep cargo を実行して追加されたディレクトリを確認
    • /Users/bork/.cargo/bin と表示されたら ~/.cargo/bin に短縮
    • この記事の手順で ~/.cargo/bin を PATH に追加

ツールの指示通りにすることに問題はありません(「最善の方法」かもしれません)が、個人的には変更する設定を正確に把握できる 2 番目のアプローチを好みます。

fish_add_path に関する注意

fish には fish_add_path という便利な関数があり、以下のようにディレクトリを PATH に追加できます:

fish_add_path /some/directory

これは便利ですが(とてもシンプルなコマンドです!)、いくつかの理由で使用をやめました:

  1. fish_add_path は「ユニバーサル変数」で将来のすべてのセッションに PATH を更新する場合と、現在のセッションのみに更新する場合があり、どちらになるか判断しにくい。ドキュメントに説明があるはずですが、理解できませんでした。
  2. 数週間または数ヶ月後にディレクトリを PATH から削除する必要が生じた場合、削除が難しい(この GitHub イシューのコメントに手順があります)。

以上

この記事が役に立てば幸いです。PATH にディレクトリを追加する際に遭遇した他の大きな注意点や、この記事に関する質問があれば、Mastodon や Bluesky でお知らせください!