假设我的.profile
里有这个
export VALUE=x:$VALUE
当我启动终端时
$ printenv VALUE
x:
结果是预期的,即
VALUE
等于dox:
。如果我继续这样做
$ printenv VALUE
x:
$ bash
bash-3.2$ printenv VALUE
x:
bash-3.2$
结果也是人们所期待的。
但是,如果我启动一个终端并启动
tmux
,那么$ printenv VALUE
x:
$ tmux
$ printenv VALUE
x:x:
最后的
VALUE
不等于dox:
。我如何启动
tmux
以避免这种情况发生,并且它的行为就像一个新的bash
会话?我在macOS 10.12.6上(Sierra)
谢谢
最佳答案
有几个原因可以解释为什么您的~/.profile
碰巧不止一次被找到。
其中之一是tmux
的启动方式使其行为类似于登录shell。因此,它将自然地产生~/.profile
(参见man bash
atINVOCATION
)。通过提供tmux
选项,可以将-l
作为登录shell启动你没有提到显式地给出这个,所以我猜你没有,但也许它是由某个别名或类似的东西隐式地传递给了tmux
。您可能需要对此进行再次检查(例如输入type tmux
)。
更可能的原因是tmux
只是启动了一个shell,然后假设它是一个登录shell,因此源代码~/.profile
。这在某种程度上也是正确的,因为启动终端muxer可以看作是登录的过程。更多信息请点击:https://superuser.com/a/970847/153009
第三种可能性(这是我试图复制你的案例的原因)是你的~/.bashrc
有意而明确地来源于你的~/.profile
。虽然这与最初的设计相悖,但人们经常会发现这一点。显然,它经常解决缺少调用脚本执行的丑陋问题。
您可以通过在${BASH_SOURCE[*]}
开始处发出~/.profile
来检查这一点(将其重定向到一个文件以确保以后可以看到它)。
由于这个问题,我在每个调用脚本(.bashrc
,.profile
等)中都有以下脚本片段:
(
echo "$(date): .profile: $0: $$"; pstree -lp $PPID 2>/dev/null
echo "BASH_SOURCE: ${BASH_SOURCE[*]}"
echo "FUNCNAME: ${FUNCNAME[*]}"
echo "BASH_LINENO: ${BASH_LINENO[*]}"
) >> ~/var/log/config-scripts.log
(根据脚本名调整第一行的名称
.profile
。)关于bash - Tmux重新加载Bash_profile,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48226514/