シェルの PATH
の設定におきましては、同じ設定ファイルが複数回読まれることもありますし、設定上、どうしてもPATH
には同じパスの値が何度も追加されてしまう状況は起こりえます。これを止めにする(重複を除去する)といのが今回のお題です。
この対策としては、1つの考え方として気にしない、というのもありだと思います。ただ、何ともだらしない感じで、個人的には気持ち悪いんですよね。。
例えば、普通にシェルを起動した時のパスの数(重複なし)は以下のように 23 になっています。
この数字は上の方のコマンドで取得している数で、uniq
コマンドを挟んでいますので、重複無しの登録パス数です。下の方が環境変数PATH
に実際に設定されてしまったパスの数で、重複して 25 になっており、2つ重複していることがわかります。
$ echo $PATH | tr ':' '\n' | sort | uniq | wc -l 23 $ echo $PATH | tr ':' '\n' | sort | wc -l 25
上記のコマンドを補足しますと、PATH
の環境変数を出力し(echo $PATH
)、:
を改行に置換する(tr ':' '\n'
)ことでそれぞれのパスを1行で出力するようにしています。出力にソートをかけて(sort
)、重複分を削除してユニークなものだけにして(uniq
)、その数を出力(wc -l
)しています。
まぁ、2つくらいでしたら、気にせずとも・・・なんですが、これで更に tmux
を起動します。上の方の結果から1つパスが追加されたことがわかります。下の方の結果から、更に重複パスの数が増えてトータルで 41 になっていることがわかります。(設定が再読込みされているのですね。)
$ echo $PATH | tr ':' '\n' | sort | uniq | wc -l 24 $ echo $PATH | tr ':' '\n' | sort | wc -l 41
変数宣言に使われる typeset
を使ってこの重複を削除します。.zshrc
、.zprofile
などのどこか1カ所に以下を追加しておきます。
# 重複パスを登録しない typeset -U path PATH
確認してみます。
ターミナル起動時です。
$ echo $PATH | tr ':' '\n' | sort | uniq | wc -l 23 $ echo $PATH | tr ':' '\n' | sort | wc -l 23
重複がなくなっているのがわかります。
tmux
を起動します。
$ echo $PATH | tr ':' '\n' | sort | uniq | wc -l 24 $ echo $PATH | tr ':' '\n' | sort | wc -l 24
こちらも重複がなくなっているのがわかります。 目的としていたことが実現できているようです。