Tmux重新加载Bash .profile

时间:2018-01-12 12:41:12

标签: bash tmux

假设我在.profile

中有这个
export VALUE=x:$VALUE

然后当我启动终端并执行

$ printenv VALUE
x:

结果是预期的结果,即VALUE等于做x:

此外,如果我继续像这样推出bash

$ printenv VALUE
x:
$ bash
bash-3.2$ printenv VALUE
x:
bash-3.2$

结果也是预期的结果。

但是,如果我启动终端并启动tmux,我会

$ printenv VALUE
x:
$ tmux
$ printenv VALUE
x:x:

且最终VALUE不等于x:

如何启动tmux以便不会发生这种情况,并且它的行为就像一个新的bash会话?

我在macOS 10.12.6(Sierra)

由于

2 个答案:

答案 0 :(得分:1)

有多种原因可能导致您的~/.profile多次被采购。

可能是tmux以某种方式启动,因此它的行为类似于登录shell。因此,它会自然地~/.profileman bashINVOCATION)。您可以通过提供选项tmux-l作为登录shell启动。你没有明确地提到这个,所以我猜你没有,但也许它被一些别名或类似内容隐含地传递给tmux。您可能需要仔细检查(例如,输入type tmux)。

更可能的原因是tmux只是启动一个shell,然后假设它是一个登录shell,因此来源~/.profile。这在某种程度上也是正确的,因为启动终端复用程序可以被视为登录过程。有关详细信息,请访问: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。)

答案 1 :(得分:0)

似乎没有办法避免tmux在没有继承调用tmux的shell的环境变量的情况下启动自己的shell。这意味着如果启动shell脚本在tmux中运行,则必须小心。例如,在bash中,可以这样做

if [ -n "$TMUX" ];
then
  echo Inside tmux
else
  echo Outside tmux
fi