20

Homebrew 経由で Mac OS X、iTerm2、zsh、Tmux を使用しています。iTerm2 でターミナル セッションを開始すると、グローバル PATH 変数は問題ないように見えます。しかし、Tmux セッションを開くと、PATH 変数は既に構成されていたのと同じパスで拡張されます。問題を解決するコード スニペットを .zshrc に入れるつもりですが、PATH 変数が 2 回いっぱいになる原因にまだ興味があります。

4

3 に答える 3

34

これは、新しい zsh プロセスごとに .zshrc が評価されるために発生します。したがって、iTerm2 を起動すると評価され、$PATH に変更が加えられます。tmux を起動すると、変更された $PATH が取得され、その中の zsh の新しいインスタンスに渡され、その新しい zsh プロセスが .zshrc の作成を再度評価します。変更をもう一度。

これを防ぐ方法はいくつかあります。

$TMUX

まず、特に tmux 内のシェルで発生しないようにするために、$TMUX が設定されている場合、これらの変更をスキップできます。

if [[ -z $TMUX ]]; then
  PATH="$PATH:/foo"
fi

zprofile

別のオプションは、.zshrc のその部分を .zprofile ファイルに移動することです。このファイルは、ログイン シェルによってのみ評価されます。ただし、デフォルトでは、tmux は新しいシェルをログイン シェルとして起動するため、tmux 構成に以下を追加して、tmux がそれを実行しないようにする必要もあります。

set -g default-command /bin/zsh

そこで zsh へのパスを調整する必要があるかもしれません。これにより、tmux がログイン シェルとして zsh プロセスを開始できなくなり、tmux 内の zsh が .zprofile を参照しなくなります。

タイプセット

重複が追加されるのを防ぐためにリンクしたコードスニペットの行に多少沿った別のオプションは、パスの変更を次のように変更することです。

typeset -aU path
path=( $path /foo )

これが機能するのは、zsh が $PATH の内容を反映する配列として $path 変数を自動的に設定するためです。typeset の -U オプションは、エントリが一意になるようにその変数を変更します。

于 2012-10-25T01:47:59.823 に答える
3

この GitHub スレッドは非常に役に立ちました。このコメントの解決策は私にとってはうまくいきました:

# /etc/zshenv
if [ -x /usr/libexec/path_helper ]; then
  PATH="" # Add this line
  eval `/usr/libexec/path_helper -s`
fi

これを行うと、 PATH の変更を の~/.zshrc代わりに配置する必要があります~/.zprofile。私もスレッドからこの解決策を試しましたが、うまくいきませんでした。

于 2014-07-27T11:58:02.163 に答える