$PATH
confファイルの~/.zshenv
変数にいくつかのディレクトリを追加しました。再起動後、これらのパスが2回表示されていることに気付きました。コールスタックを印刷しようとすると、次のようになりました。
.zshenv sourced by
18385:/bin/zsh /etc/kde4/kdm/Xsession /usr/bin/startkde
2158: -:0
1438: kdm
1: /sbin/init
.zshenv sourced by
22143:/bin/zsh
20858: /usr/bin/yakuake -session 10d5e3636b000141388223100000058160027_1415750006_832059
18385: upstart --user
2158: -:0
1438: kdm
1: /sbin/init
したがって、2つ目は、$PATH
変数をチェックしていたyakuakeを開いたことが原因で問題ありません。しかし、最初の呼び出しは私には明確ではありません。 /etc/kde4/kdm/Xsession
がユーザーの構成を読み込もうとするのはなぜですか? $PATH
の重複を避ける理由と最善の方法は何ですか?
.zshenv
の内容を最初の実行のチェックにラップするような回避策を提案しないでください(別名、ガードを含む)
/etc/kde4/kdm/Xsession
は実際にはユーザーのシェル構成の一部をロードするために使用されますが、実際にはnot明示的に~/.zshenv
をロードします(コメントにはロードされていると記載されていますが)。 ~/.zshenv
(および/etc/zshenv
)は、zsh
が起動するたびに自動的にロードされますが、これをオーバーライドすることはできません。また、/etc/kde4/kdm/Xsession
はログインシェルで実行されるため、zsh
--~/.zshenv
も読み込まれますが、実際に/etc/kde4/kdm/Xsession
で何が行われてもかまいません。
そして、/etc/kde4/kdm/Xsession
は、コマンドラインシェル以外の手段(KDEメニュー、自動起動、デスクトップアイコンなど)を介して起動されるプログラムで使用できるように、ユーザーの設定を読み込もうとします。
$PATH
の重複を防ぐことに関しては、これでうまくいくはずです。PATH=$PATH:/usr/local/bin:/my/path/here:/another/path
のようなものを使用する代わりに、
new_paths=(/usr/local/bin /my/path/here /another/path)
path=($path ${new_path:|path})
new_path
は、追加するパスの配列です。 path
はPATH
の配列バージョンであり、内容は同じですが、コロンで区切られたリストではなく実際の配列と同じです。 ${new_path:|path}
は、まだpath
にないnew_path
の要素の配列に置き換えられます。