tmux - 环境变量不显示在会话中

3
我正在尝试从screen转移到tmux(最终在byobu内使用tmux)。然而,我遇到了一个严重的问题,即环境变量没有被应用,特别是PS1。它们中的任何一个都没有被复制到会话(或窗口)环境中。我找到了这个似乎相关的主题:如何使用当前环境启动tmux? 然而,当我执行时,实际上可以看到所有正确的变量。
:show-environment -g

但是它们都没有被传递到会话环境中,所以当我执行时看不到任何内容。
:show-environment

我在我的~/.tmuxrc文件中有正确的update-environment语句:

# 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虚拟环境包装器函数,并期望它们可用。

有没有办法禁用此行为?如果没有,我该如何将我的PS1变量传递给tmux?

编辑11/13/2013

我意识到删除第一行(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个回答

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。


谢谢您的回答。我知道 tmux 无法更新正在运行进程的环境变量,但这不是我想要的。我希望新打开的窗格和窗口具有与启动 tmux 时完全相同的变量集。这似乎是 screen 的默认行为,但我仍然不明白为什么在 tmux 中模拟它如此困难? - user1496984
啊,抱歉我误解了。你想要的肯定是通过从update-environment中删除所有内容来实现的。在set-option中不应该使用-a,因为这会附加到update-environment - sjbx
再次感谢您的指引!我更新了问题并发现了一些新情况。导致环境变量出现问题的是第一行代码。但是,如果没有这行代码,每个在tmux中新建的屏幕都会以登录shell方式启动。我不确定如何更改这种行为。 - user1496984

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接