假设我在.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)
由于
答案 0 :(得分:1)
有多种原因可能导致您的~/.profile
多次被采购。
可能是tmux
以某种方式启动,因此它的行为类似于登录shell。因此,它会自然地~/.profile
(man bash
见INVOCATION
)。您可以通过提供选项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