第2の人生の構築ログ

自分の好きなことをやりつつ、インカムもしっかりと。FIRA60 (Financial Independence, Retire Around 60) の実現を目指します。SE を生業としていますが、自分でプログラミングしながら自分が欲しいと思うアプリケーションを作ることが楽しみです。旅行と温泉、音楽と読書は欠かすことができません。

【シェル】zshでPATHに同じパスが何度も追加される状況を止めにする(重複を除去する)

f:id:dr_taka_n:20200216135238p:plain

シェルの 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

こちらも重複がなくなっているのがわかります。 目的としていたことが実現できているようです。