tmux - 环境变量不会出现在会话中

时间:2013-08-14 20:14:31

标签: tmux

我正试图从屏幕移动到tmux(最终从byobu内部使用tmux)。但是,我没有应用环境变量的严重问题,尤其是PS1。它们都不会被复制到会话(或窗口)环境中。我发现这个线程似乎很相关:

How do I start tmux with my current environment?

然而,当我

时,我实际上可以看到我所有的正确变量
:show-environment -g

但是没有一个被转移到会话环境,所以当我做

时我什么都看不到
:show-environment

我的update-environment文件中有正确的~/.tmuxrc声明:

# start a non-login shell by default for each new window
set -g default-command 'bash'

# Prefix is C-a like in screen
unbind C-b
set -g prefix C-a

# Carry over the PS1
set-option -ga update-environment "PS1"
坦率地说,这一切对我来说都是一团糟。我可以看到从每个屏幕的干净会话开始的好处,但在大多数情况下,这似乎很痛苦。我导出我打算在子进程中使用的变量,例如Python virtualenvwrapper函数,并期望它们可用。

有没有办法禁用此行为?如果没有,我应该尝试将我的PS1变量转移到tmux?

编辑2013年11月13日

我意识到删除第一行(default-command bash继承所有环境变量。但是,我真的不希望每个新的tmux屏幕作为登录shell启动。例如,我在登录shell中专门声明了我的PS1变量,因此每当我打开一个新屏幕时它都不会被覆盖。

根据以下帖子,tmux中的每个新屏幕都应作为非登录shell启动: https://superuser.com/questions/614277/profile-and-bash-profile-ignored-when-starting-tmux-from-bashrc

为什么我没有默认发生这种情况?

1 个答案:

答案 0 :(得分:6)

Tmux无法更新正在运行的进程(例如bash),它只能更新自己的环境。如果您要启动一个新窗口/窗格,它将选择新环境。我的建议是使用这样的实用函数:

#!/bin/bash

tmup () 
{ 
    echo -n "Updating to latest tmux environment...";
    export IFS=",";
    for line in $(tmux showenv -t $(tmux display -p "#S") | tr "\n" ",");
    do
        if [[ $line == -* ]]; then
            unset $(echo $line | cut -c2-);
        else
            export $line;
        fi;
    done;
    unset IFS;
    echo "Done"
}

这将通过tmux已经了解并更新shell的所有更新环境。