web-dev-qa-db-ja.com

RVM + TMUX- $ PATHのエントリが重複しています

私のLinuxターミナル構成ファイル(.bash_profile、.profile、.bashrc)は、いくつかのカスタムディレクトリを付加することで$ PATHを展開します。これは1回だけ発生します(また、ENVで使用可能なベースのガードをいくつか含めて、1回だけ発生するように強制しました)。私の.bash_profileは、独自のカスタムディレクトリを付加する.rvmスクリプト(~/.rvm/scripts/rvm)もソースします。これらのRVMdirが最初である必要があります。

クリーンなbashセッションに参加している限り、すべて問題ありません。

ただし、tmuxを実行すると、構成ファイルのディレクトリエントリが(ENV変数ガードに関係なく)PATHの前に二重に追加されます。 tmuxにはENV変数用の2つの環境があり、それらをマージするようです。

.rvmスクリプトが先頭に追加されたエントリは一度だけ追加され、tmuxシナリオでは最初に終了しないため、これは問題です。

どうすればこれを防ぐことができますか?

編集-追加情報:すべてのPATHの追加は、.profile.bash_profile)から含める. ~/.profileの先頭に追加されます。私のGUI端末はすべて「ログインシェルとして」実行されます。

各構成ファイルでは、次の形式のガードを使用して、二重に含まれないようにしています。

    if [ "$PROFILE_SOURCED" != "true" ]; then
         export PROFILE_SOURCED=true
    ...
    fi

PATHの前にエントリを付けると、export PATH=entry:$PATHを意味します。

3
PSkocik

以下によって解決されます:

  1. .profileのPATH操作コードの周りにガードを配置しました

    if [ "$PATHS" != "true" ]; then
        export PATHS="true"
    #Manipulate and export PATH over here
    fi
    
  2. .bash_profileおよび.bashrc周辺のファイルレベルのガードを削除しました

  3. [〜#〜]重要[〜#〜][〜#〜]再起動[〜#〜]tmuxサーバー。 (killall tmux)-マニュアルには、サーバーが親シェルから継承する独自の環境を維持していることが示されています。設定ファイルが変更された場合、tmuxを新たに開始する必要があります。

2
PSkocik

環境変数に重複するエントリを取得する可能性の1つは、それらを再帰的に定義することです。再帰的定義は、~/.bashrcに次のようなものがある場合に発生します。

export SOME_VARIABLE=$SOME_VARIABLE:/some/paths/

tmuxが起動すると、デフォルトでログインシェルが起動します。 ~/.tmux.confでオプションを設定することにより、この動作を変更できます

set-option -g default-command bash #or zsh, or whatever

この質問 で述べたように。いずれにせよ、tmuxはシェルを開始し、シェルは~/.bashrcをソースします(非ログインシェルまたはログインシェルとして、~/.profileを介して)。環境変数は.bashrcファイルで再帰的に定義されているため、~/.bashrcを再度実行すると、すでに定義されているパスに/some/pathsが追加されます。したがって、それらは複製されます。

シェルが起動されると、多くの環境変数は空になります。したがって、それらを次のように定義します

export SOME_VARIABLE=:/some/paths/

害を及ぼすことはなく、tmuxが重複を作成するのを防ぎます。それらがいくつかの値(PATHなど)で始まる場合、1つの解決策は、変数の定義にこれらのデフォルトを書き留めることです。

0
capstain