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

问题描述 投票:2回答:3

我想知道有什么简单的方法可以更改bash环境变量并将其应用于tmux会话中的Windows吗?

我已经用Google搜索,但是没有找到解决方案,所以我将问题发布在这里。

谢谢!

tmux
3个回答
4
投票
但是,您可以使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

这样,tmux会话中的外壳程序每次显示新提示时都会更新SSH代理。重新连接后,我所要做的就是在提示符下按Enter键,它会捕获新的SSH代理连接。

Bash还具有预命令机制,尽管我不知道如何立即配置它。您还可以配置更多程序以使用show-environment进行自我更新,例如vim或emacs。但是,您将需要分别配置可能要使用的每个程序。

3
投票
甚至没有困难的方法;操纵另一个进程的环境变量充其量是不可移植的。

0
投票
启动tmux时,它将环境复制到全局环境中。创建新窗口时,它将合并全局环境和会话环境以设置该窗口的环境。我们可以通过以下方式查看这些环境:

tmux show-environment [-g] [-t target-session]

甚至更好,即使在Windows自己的tmux会话中,我们也可以更新环境:

tmux set-environment [-gru] [-t target-session] name [value]

有关标志的完整说明,请参见tmux man page

此功能正是我想要的。不幸的是,它不会更新现有shell的环境,但是我们可以轻松地循环tmux showenv -g以重新导出可能由另一个进程设置的tmux环境。

这是我的用例:


通过设置外壳程序配置的方式,我将环境导出到登录外壳程序中,然后执行到tmux会话中。我认为由于env var不会经常更改,因此我不需要每次都在新的非登录shell中提供它们。但是,当它们发生更改时,我不想重新启动整个tmux会话,以使新的tmux窗口知道更改。使用update-environment选项并重新连接可以解决会话重新启动的问题,但在我的tmux配置中维护显式的可扩展env var的清单很麻烦。

[使用以下功能,我们可以例如以~/.shenv之类的方式更新环境变量,而不是采购文件(. ~/.shenv),我们可以

promote文件(promote ~/.shenv)从此更新环境继承的tmux窗口。

promote() { sourced="$1"; shift . "$sourced" env - \ "HOME=$HOME" \ "SHELL=$SHELL" | \ sh -c ". $sourced; env" | while read -r line; do arg="$(echo "$line" | cut -d= -f1)" val="$(echo "$line" | cut -d= -f2-)" tmux set-environment -gt local "$arg" "$val" done }

© www.soinside.com 2019 - 2024. All rights reserved.