web-dev-qa-db-ja.com

Kubuntu 14.10、.zshenvは2回供給されます

$PATHconfファイルの~/.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の内容を最初の実行のチェックにラップするような回避策を提案しないでください(別名、ガードを含む)

1
Grief

/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は、追加するパスの配列です。 pathPATHの配列バージョンであり、内容は同じですが、コロンで区切られたリストではなく実際の配列と同じです。 ${new_path:|path}は、まだpathにないnew_pathの要素の配列に置き換えられます。

0
Adaephon