如何让Tmux启动时像全新Bash会话不重复加载.profile变量
先帮你理清楚问题根源:你的.profile里写了export VALUE=x:$VALUE,这条语句会在登录shell启动时执行。而tmux默认会把当前shell的所有环境变量传递给它启动的新shell,同时tmux默认启动的是登录shell(会再次读取.profile)。这样一来,原shell里的VALUE=x:被带到tmux的shell中,.profile又执行一次追加操作,最终就变成了x:x:。而你直接启动bash时,默认启动的是交互式非登录shell,不会读取.profile,只是继承环境变量,所以不会出现重复追加的情况。
下面给你几个可行的解决办法,按需选择:
方法1:修改tmux配置,启动非登录shell
编辑你的~/.tmux.conf文件(没有的话直接新建),添加以下内容:
set-option -g default-command "bash"
这样tmux启动的就是交互式非登录shell,不会读取.profile,自然就不会重复执行环境变量追加操作了。
方法2:在.profile中添加判断,避免重复追加
如果不想改动tmux配置,可以修改.profile里的语句,只在VALUE不存在(或未包含目标前缀)时才执行追加:
if [ -z "$VALUE" ]; then export VALUE=x: else # 可选:检查是否已经包含前缀,彻底避免重复 if [[ ! "$VALUE" == x:* ]]; then export VALUE=x:$VALUE fi fi
这样不管启动的是登录还是非登录shell,都不会出现重复追加的问题。
方法3:启动tmux时临时清除VALUE变量
如果只是临时需要这个效果,可以在启动tmux前先清空VALUE变量:
VALUE= tmux
这样tmux启动的shell里VALUE是空值,.profile执行后就只会设置成x:,和直接启动终端的效果完全一致。
额外小提示
macOS下的bash,登录shell会读取.profile,交互式非登录shell会读取.bashrc。如果你的环境变量配置应该在所有交互式shell中生效,可以把配置移到.bashrc里,再在.profile中添加一行source ~/.bashrc,这样既能保证配置生效,也能避免重复执行的问题。
内容的提问来源于stack exchange,提问作者mljrg

