我的 Linux 终端配置文件(.bash_profile、.profile、.bashrc)通过在前面添加一些自定义目录来扩展 $PATH。这只会发生一次(并且我还包含了一些基于 ENV 变量的防护来强制它只能发生一次)。我.bash_profile
还获取了 .rvm 脚本 ( ~/.rvm/scripts/rvm
),该脚本在其前面添加了自己的自定义目录。这些 RVM 目录必须位于第一位。
只要我处于干净的bash会话中,一切都好。
但是,如果我运行tmux
,我的配置文件中的目录条目将双重添加到 PATH 前面(无论我的 ENV 变量保护如何)。 tmux 似乎有两个 ENV 变量环境,然后将其合并。
这是一个问题,因为 .rvm 脚本前置的条目仅前置一次,并且在 tmux 场景中它们不会首先结束。
我怎样才能防止这种情况发生?
编辑—附加信息:
我所有的 PATH 添加都放在前面.profile
,我将其包含在.bash_profile
( . ~/.profile
) 中。我的所有 GUI 终端都“作为登录 shell”运行。
在每个配置文件中,我使用以下形式的防护来防止双重包含:
if [ "$PROFILE_SOURCED" != "true" ]; then
export PROFILE_SOURCED=true
...
fi
通过在 PATH 中添加一个条目,我的意思是export PATH=entry:$PATH
.
答案1
通过以下方法解决:
在我的 PATH 操作代码周围放置了一个警卫
.profile
if [ "$PATHS" != "true" ]; then export PATHS="true" #Manipulate and export PATH over here fi
.bash_profile
删除了周围的文件级防护.bashrc
重要的: 重新启动服务器
tmux
。(killall tmux
)——手册表明服务器维护自己的环境,该环境从其父 shell 继承而来。如果配置文件发生变化,则tmux
需要重新启动。
答案2
获得环境变量重复条目的一种可能性是递归地定义它们。当你有 in~/.bashrc
类似的东西时,就会发生递归定义:
export SOME_VARIABLE=$SOME_VARIABLE:/some/paths/
启动时tmux
,它默认启动登录 shell。您可以通过在~/.tmux.conf
选项中设置来更改此行为
set-option -g default-command bash #or zsh, or whatever
正如中所述这个问题。无论哪种方式,tmux
都会启动一个 shell,该 shell 又会提供源~/.bashrc
(作为非登录 shell 或作为登录 shell,通过~/.profile
)。由于环境变量是在文件中递归定义的.bashrc
,因此再次遍历~/.bashrc
将添加/some/paths
到那些已定义的路径中。所以它们会被复制。
当 shell 启动时,许多环境变量都是空的。因此将它们定义为
export SOME_VARIABLE=:/some/paths/
应该不会造成任何伤害,并且会防止tmux
创建重复项。如果他们从某些值开始(例如PATH
),一种解决方案可能是在变量的定义中写下这些默认值。