zshでPATHが壊れないようにPATHに新しいディレクトリを通す

TL;DR

特に順番は気にしないとき

path+=('/hoo/bar/baz');

最初にいれたいとき

path=('/hoo/bar/baz' $path)

PATH通そうとして壊れるヤツ

UNIXを使っている上で避けて通れないのが環境変数$PATHでしょう。 :区切りにディレクトリを列挙して、列挙されているディレクトリ直下に置かれているバイナリファイルをコマンドとして使えるようにするアレですね。

そんな$PATHに新しいディレクトリを追加しようとして、ついつい次のような事故がよく置きます。

export PATH="/hoo/bar/baz"

こうしてしまうと最初から$PATHに設定していたデータが吹っ飛んで、PATHの中身が/hoo/bar/bazだけになってしまいます。こうなるとlsとかのコマンドが使えなくなる訳ですね。

zshだと$pathで配列として扱える

この問題は何が原因かというと$PATHの中身が単なる文字列なのが結構原因何じゃないかなと思っています。 $PATHは明らかに配列構造なので、配列のインターフェースとして扱えればある程度事故が減るはずです。

zshではなんと$pathという変数があり、機能そのものは$PATHと同様に環境変数PATHなのですが、$pathは配列として設定されています。

これによってzshでは配列に対して+=で末尾に要素を追加できるので、path+=('/bar/baz')とか書いておけば、export PATH="$PATH:/bar/baz"と書いたのと同じ意味になります。最後にPATH書く必要がなくて便利。

とはいえ先頭についかするunshift相当の操作は演算子でできないので、path=('/hoo/bar/baz' $path)みたいに書く必要があります。まぁこれはしょうがない。

という訳でzshPATHを操作するときは$path使ったほうが便利です。どうぞお試しください。

参考

stackoverflow.com