如何更改环境变量并应用于 tmux 会话中的所有窗口

kai*_*kai 7 tmux

我想知道是否有任何简单的方法可以更改 bash 环境变量并应用于 tmux 会话中的 Windows?

我用谷歌搜索并没有找到解决方案,所以我在这里发布问题。

谢谢!!

Mic*_*and 6

您不能直接更改环境变量。

但是,您可以使 tmux 实例内的 shell 终端获取新变量。这需要几个步骤。

首先,tmux 可以自行更新环境变量。配置指令update-environment执行此操作。此处列出的任何变量都将自动更新 - 连接到 tmux 会话会使用刚刚连接的客户端的值更新会话的环境变量。因此,如果您运行tmux attach并进行了SSH_AUTH_SOCK设置,那么 tmux 会话将获得 的新值SSH_AUTH_SOCK

但是,这只会更新会话的变量,因此只有新的窗格/窗口才会获取值。现有窗口仍将具有旧值。正如@IgnacioVazquez-Abrams 所说,这个问题没有直接的解决办法。

但是,您可以在许多程序中修复它。最新版本的 tmux 有一个show-environment命令,可以在会话中查询环境变量的当前值。这允许您在程序中使用逻辑后获取环境变量update-environment

例如,您可以让一些 shell 获取新值。在 ZSH 中,我使用以下precmd钩子来完成此操作~/.zshrc

_update_ssh_agent() {
    local var
    var=$(tmux show-environment |grep '^SSH_AUTH_SOCK=')
    if [ "$?" -eq 0 ]; then
        eval "$var"
    fi
}
if [[ -n "$TMUX" ]]; then
    add-zsh-hook precmd _update_ssh_agent
fi
Run Code Online (Sandbox Code Playgroud)

这使得 tmux 会话内的 shell 每次显示新提示时都会更新 SSH 代理。重新连接后,我所要做的就是在提示符下按 Enter 键,它就会获取新的 SSH 代理连接。

Bash 也有一个预命令机制,尽管我不知道如何立即配置它。您还可以配置更多程序来进行show-environment自我更新,例如 vim 或 emacs。但是,您需要单独配置您可能想要执行此操作的每个程序。


Ign*_*ams 3

不。

甚至没有一条困难的路;操纵另一个进程的环境变量充其量是不可移植的。