Homebrew 経由で Mac OS X、iTerm2、zsh、Tmux を使用しています。iTerm2 でターミナル セッションを開始すると、グローバル PATH 変数は問題ないように見えます。しかし、Tmux セッションを開くと、PATH 変数は既に構成されていたのと同じパスで拡張されます。問題を解決するコード スニペットを .zshrc に入れるつもりですが、PATH 変数が 2 回いっぱいになる原因にまだ興味があります。
3 に答える
これは、新しい 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 オプションは、エントリが一意になるようにその変数を変更します。
この GitHub スレッドは非常に役に立ちました。このコメントの解決策は私にとってはうまくいきました:
# /etc/zshenv
if [ -x /usr/libexec/path_helper ]; then
PATH="" # Add this line
eval `/usr/libexec/path_helper -s`
fi
これを行うと、 PATH の変更を の~/.zshrc
代わりに配置する必要があります~/.zprofile
。私もスレッドからこの解決策を試しましたが、うまくいきませんでした。