私の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
を意味します。
以下によって解決されます:
.profile
のPATH操作コードの周りにガードを配置しました
if [ "$PATHS" != "true" ]; then
export PATHS="true"
#Manipulate and export PATH over here
fi
.bash_profile
および.bashrc
周辺のファイルレベルのガードを削除しました
[〜#〜]重要[〜#〜]:[〜#〜]再起動[〜#〜]tmux
サーバー。 (killall tmux
)-マニュアルには、サーバーが親シェルから継承する独自の環境を維持していることが示されています。設定ファイルが変更された場合、tmux
を新たに開始する必要があります。
環境変数に重複するエントリを取得する可能性の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つの解決策は、変数の定義にこれらのデフォルトを書き留めることです。