我想知道有什么简单的方法可以更改bash环境变量并将其应用于tmux会话中的Windows吗?
我已经用Google搜索,但是没有找到解决方案,所以我将问题发布在这里。
谢谢!
首先,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。但是,您将需要分别配置可能要使用的每个程序。
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 }