如何启动可覆盖.bash_profile中环境变量的tmux会话?
我来帮你搞定这个问题!你遇到的核心问题是tmux启动shell时会加载你的.bash_profile配置文件,而里面的export ABC=from_bash_profile语句会覆盖你通过-e参数传给tmux的变量值。DEF能正常生效,是因为你的配置文件里没定义这个变量,所以tmux传的变量能保留下来。
下面给你几个实用的解决方案,你可以根据自己的需求选择:
方案1:临时启动不加载配置的shell
如果你只是临时需要这个会话,不想加载.bash_profile里的任何配置,可以直接让tmux启动一个不加载配置文件的bash:
tmux new -s exp -e ABC=inside_tmux -e DEF=inside_tmux bash --noprofile --norc
这个命令里的--noprofile会跳过加载.bash_profile,--norc跳过.bashrc,这样tmux传的变量就不会被覆盖了。缺点是你也会失去配置里的别名、路径设置等,适合临时测试用。
方案2:修改.bash_profile,避免覆盖已存在的变量
如果你想保留配置里的其他设置,只针对特定变量做处理,可以修改你的.bash_profile,给变量设置加个判断:只有当变量不存在的时候才设置它。
把原来的export ABC=from_bash_profile改成下面这样:
if [ -z "$ABC" ]; then export ABC=from_bash_profile fi
-z "$ABC"的意思是“如果ABC变量为空”,这样如果tmux已经给ABC传了值,配置文件就不会再覆盖它了。这种方法最灵活,不影响其他配置的使用。
方案3:让tmux启动非登录shell(避免加载.bash_profile)
tmux默认会把shell作为登录shell启动,这时候bash会加载.bash_profile。如果你的ABC只在.bash_profile里定义,而不在.bashrc里,你可以让tmux启动非登录shell:
临时生效的方式
直接在启动会话时指定启动非登录shell:
tmux new -s exp -e ABC=inside_tmux -e DEF=inside_tmux bash
永久生效的方式
如果想让所有tmux会话都默认启动非登录shell,可以修改~/.tmux.conf文件,添加一行:
set-option -g default-command "bash"
这样tmux启动的shell就不会加载.bash_profile了,自然也就不会覆盖你传的ABC变量。
备注:内容来源于stack exchange,提问作者m01010011

