假设我的.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 bashatINVOCATION)。通过提供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/

10-13 09:40