|
28 | 28 | <meta property="og:description" content="参考教程: https://www.ruanyifeng.com/blog/2019/10/tmux.html tmux使会话与窗口解绑,一个窗口source .bashrc更新了,另一个窗口可能没有 ctrl+b 前缀键 % 分成左右两栏 " 分成上下两栏 up 选择上边的窗口 [ 查看历史记录 窗口 <C-d> 删除窗口 <C-b> z"> |
29 | 29 | <meta property="og:locale" content="zh_CN"> |
30 | 30 | <meta property="article:published_time" content="2023-11-24T16:00:00.000Z"> |
31 | | -<meta property="article:modified_time" content="2025-04-14T12:20:58.257Z"> |
| 31 | +<meta property="article:modified_time" content="2025-04-20T01:47:02.312Z"> |
32 | 32 | <meta property="article:author" content="SIMULEITE"> |
33 | 33 | <meta property="article:tag" content="基本操作"> |
34 | 34 | <meta name="twitter:card" content="summary"> |
@@ -223,7 +223,7 @@ <h1 class="post-title" itemprop="name headline"> |
223 | 223 | <i class="far fa-calendar-check"></i> |
224 | 224 | </span> |
225 | 225 | <span class="post-meta-item-text">更新于</span> |
226 | | - <time title="修改时间:2025-04-14 20:20:58" itemprop="dateModified" datetime="2025-04-14T20:20:58+08:00">2025-04-14</time> |
| 226 | + <time title="修改时间:2025-04-20 09:47:02" itemprop="dateModified" datetime="2025-04-20T09:47:02+08:00">2025-04-20</time> |
227 | 227 | </span> |
228 | 228 |
|
229 | 229 |
|
@@ -264,17 +264,18 @@ <h1 id="tmux-path-双向绑定"><a class="markdownIt-Anchor" href="#tmux-path- |
264 | 264 | 下面的脚本会帮助我们解决问题,它将tmux白名单内的全局变量值自动同步到Shell环境变量。</p> |
265 | 265 | <span id="more"></span> |
266 | 266 | <ol> |
267 | | -<li>首先,编写<code>~/.tmux.conf</code>白名单</li> |
| 267 | +<li>首先,编写<code>~/.tmux.conf</code>白名单。以NACOS为例:<br /> |
| 268 | +<code>参考教程(zsh):https://manselmi.github.io/notes/tmux-env-var-sync/</code></li> |
268 | 269 | </ol> |
269 | | -<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 参考源(zsh版本)</span><br><span class="line"># https://www.mankier.com/1/tmux#Options</span><br><span class="line"># https://www.mankier.com/1/tmux#Global_and_Session_Environment</span><br><span class="line">set-option -g update-environment \</span><br><span class="line">'DISPLAY KRB5CCNAME SSH_AGENT_PID SSH_ASKPASS SSH_AUTH_SOCK SSH_CLIENT SSH_CONNECTION SSH_TTY \</span><br><span class="line">SSH_USER_AUTH WINDOWID XAUTHORITY'</span><br><span class="line">set -g update-environment "NACOS_USERNAME NACOS_PASSWORD"</span><br></pre></td></tr></table></figure> |
| 270 | +<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">https://www.mankier.com/1/tmux#Options</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">https://www.mankier.com/1/tmux#Global_and_Session_Environment</span></span><br><span class="line">set-option -g update-environment \</span><br><span class="line">'DISPLAY KRB5CCNAME SSH_AGENT_PID SSH_ASKPASS SSH_AUTH_SOCK SSH_CLIENT SSH_CONNECTION SSH_TTY \</span><br><span class="line">SSH_USER_AUTH WINDOWID XAUTHORITY \</span><br><span class="line">NACOS_USERNAME NACOS_PASSWORD \</span><br><span class="line">'</span><br></pre></td></tr></table></figure> |
270 | 271 | <ol start="2"> |
271 | 272 | <li>接着编写<code>~/.bashrc</code>同步脚本,下面的脚本兼容了自动打开tmux操作。</li> |
272 | 273 | </ol> |
273 | | -<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Tmux</span></span><br><span class="line"><span class="function"><span class="title">tm</span></span>() {</span><br><span class="line"> <span class="built_in">local</span> SESSION_NAME=<span class="string">"<span class="variable">${1:-default}</span>"</span></span><br><span class="line"> <span class="built_in">shift</span> <span class="comment"># 移除第一个参数,保留其他参数</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> [[ <span class="string">"<span class="variable">$1</span>"</span> == <span class="string">"attach"</span> ]]; <span class="keyword">then</span></span><br><span class="line"> tmux attach -t <span class="string">"<span class="variable">$SESSION_NAME</span>"</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> tmux new-session -AD -s <span class="string">"<span class="variable">$SESSION_NAME</span>"</span> <span class="string">"<span class="variable">$@</span>"</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment"># 同步环境变量到 tmux 全局环境</span></span><br><span class="line"><span class="function"><span class="title">tmux_global_update_var</span></span>() {</span><br><span class="line"> <span class="built_in">local</span> VAR=<span class="string">"<span class="variable">$1</span>"</span></span><br><span class="line"> <span class="built_in">local</span> VALUE=<span class="string">"<span class="variable">$2</span>"</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> [[ -z <span class="string">"<span class="variable">$VALUE</span>"</span> ]]; <span class="keyword">then</span></span><br><span class="line"> <span class="comment"># 如果未指定值且当前 shell 中变量未设置,则从 tmux 全局环境中移除</span></span><br><span class="line"> tmux set-environment -gru -- <span class="string">"<span class="variable">$VAR</span>"</span> &>/dev/null</span><br><span class="line"> <span class="built_in">return</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 将当前值设置到 tmux 全局环境</span></span><br><span class="line"> tmux set-environment -g -- <span class="string">"<span class="variable">$VAR</span>"</span> <span class="string">"<span class="variable">$VALUE</span>"</span> &>/dev/null</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment"># 从 tmux 全局环境同步变量到当前 shell</span></span><br><span class="line"><span class="function"><span class="title">tmux_shell_update_var</span></span>() {</span><br><span class="line"> <span class="built_in">local</span> VAR=<span class="string">"<span class="variable">$1</span>"</span></span><br><span class="line"> <span class="built_in">local</span> TMUX_OUTPUT</span><br><span class="line"> <span class="built_in">local</span> TMUX_ERROR_CODE</span><br><span class="line"></span><br><span class="line"> TMUX_OUTPUT=$(tmux show-environment -gs -- <span class="string">"<span class="variable">$VAR</span>"</span> 2>/dev/null)</span><br><span class="line"> TMUX_ERROR_CODE=$?</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> [[ <span class="variable">$TMUX_ERROR_CODE</span> -eq 0 ]]; <span class="keyword">then</span></span><br><span class="line"> <span class="comment"># 使用 eval 执行 tmux 输出的变量赋值(存在注入风险,需谨慎)</span></span><br><span class="line"> <span class="built_in">eval</span> <span class="string">"<span class="variable">$TMUX_OUTPUT</span>"</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="comment"># 变量不存在时清除本地环境</span></span><br><span class="line"> <span class="built_in">unset</span> <span class="string">"<span class="variable">$VAR</span>"</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment"># 主同步函数</span></span><br><span class="line"><span class="function"><span class="title">tmux_update_environment</span></span>() {</span><br><span class="line"> <span class="comment"># 检查 tmux 是否存在</span></span><br><span class="line"> <span class="keyword">if</span> ! <span class="built_in">command</span> -v tmux &>/dev/null; <span class="keyword">then</span></span><br><span class="line"> <span class="built_in">return</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 获取需要同步的变量列表(与 tmux.conf 中的 update-environment 一致)</span></span><br><span class="line"> <span class="built_in">local</span> -a VARS</span><br><span class="line"> <span class="built_in">mapfile</span> -t VARS < <(tmux show-options -gv update-environment | <span class="built_in">tr</span> <span class="string">' '</span> <span class="string">'\n'</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 根据是否在 tmux 会话中选择同步方向</span></span><br><span class="line"> <span class="keyword">if</span> [[ -z <span class="string">"<span class="variable">$TMUX</span>"</span> ]]; <span class="keyword">then</span></span><br><span class="line"> <span class="comment"># 不在 tmux 中:将当前 shell 的变量同步到 tmux 全局环境</span></span><br><span class="line"> <span class="keyword">for</span> var <span class="keyword">in</span> <span class="string">"<span class="variable">${VARS[@]}</span>"</span>; <span class="keyword">do</span></span><br><span class="line"> tmux_global_update_var <span class="string">"<span class="variable">$var</span>"</span> <span class="string">"<span class="variable">${!var}</span>"</span></span><br><span class="line"> <span class="keyword">done</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="comment"># 在 tmux 中:从 tmux 全局环境同步变量到当前 shell</span></span><br><span class="line"> <span class="keyword">for</span> var <span class="keyword">in</span> <span class="string">"<span class="variable">${VARS[@]}</span>"</span>; <span class="keyword">do</span></span><br><span class="line"> tmux_shell_update_var <span class="string">"<span class="variable">$var</span>"</span></span><br><span class="line"> <span class="keyword">done</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment"># 绑定到 PROMPT_COMMAND(每次命令执行前触发同步)</span></span><br><span class="line">PROMPT_COMMAND=<span class="string">"tmux_update_environment; <span class="variable">$PROMPT_COMMAND</span>"</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">command</span> -v tmux &> /dev/null; <span class="keyword">then</span></span><br><span class="line"> <span class="comment"># 检查是否在SSH连接中(可选)</span></span><br><span class="line"> <span class="keyword">if</span> [ -n <span class="string">"<span class="variable">$SSH_CONNECTION</span>"</span> ] && [ -z <span class="string">"<span class="variable">$TMUX</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line"> <span class="comment"># 检查是否存在默认会话</span></span><br><span class="line"> <span class="keyword">if</span> tmux has-session -t default 2>/dev/null; <span class="keyword">then</span></span><br><span class="line"> <span class="built_in">exec</span> tmux attach -t default</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="built_in">exec</span> tmux new -s default</span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure> |
| 274 | +<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># tmux environment management for bash</span></span><br><span class="line"><span class="comment"># This ensures environment variables are synced between tmux sessions and doesn't interfere with non-interactive sessions</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">tm</span></span>() {</span><br><span class="line"> <span class="built_in">local</span> SESSION_NAME=<span class="string">"<span class="variable">${1:-default}</span>"</span></span><br><span class="line"> <span class="built_in">shift</span></span><br><span class="line"> tmux new-session -AD -s <span class="string">"<span class="variable">$SESSION_NAME</span>"</span> <span class="string">"<span class="variable">$@</span>"</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">tmux_global_update_var</span></span>() {</span><br><span class="line"> <span class="built_in">local</span> VAR=<span class="string">"<span class="variable">$1</span>"</span></span><br><span class="line"> <span class="built_in">local</span> VALUE</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> [ <span class="variable">$#</span> -ge 2 ]; <span class="keyword">then</span></span><br><span class="line"> VALUE=<span class="string">"<span class="variable">$2</span>"</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="keyword">if</span> [[ -v <span class="variable">${VAR}</span> ]]; <span class="keyword">then</span></span><br><span class="line"> VALUE=<span class="string">"<span class="variable">${!VAR}</span>"</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> tmux set-environment -gru -- <span class="string">"<span class="variable">$VAR</span>"</span> >/dev/null 2>&1</span><br><span class="line"> <span class="built_in">return</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"> tmux set-environment -g -- <span class="string">"<span class="variable">$VAR</span>"</span> <span class="string">"<span class="variable">$VALUE</span>"</span> >/dev/null 2>&1</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">tmux_shell_update_var</span></span>() {</span><br><span class="line"> <span class="built_in">local</span> VAR=<span class="string">"<span class="variable">$1</span>"</span></span><br><span class="line"> <span class="built_in">local</span> TMUX_OUTPUT</span><br><span class="line"> <span class="built_in">local</span> TMUX_ERROR_CODE</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> TMUX_OUTPUT=$(tmux show-environment -gs -- <span class="string">"<span class="variable">$VAR</span>"</span> 2>/dev/null); <span class="keyword">then</span></span><br><span class="line"> <span class="built_in">eval</span> <span class="string">"<span class="variable">$TMUX_OUTPUT</span>"</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="built_in">unset</span> <span class="string">"<span class="variable">$VAR</span>"</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">tmux_update_environment</span></span>() {</span><br><span class="line"> <span class="built_in">command</span> -v tmux >/dev/null || <span class="built_in">return</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">local</span> VARS=($(tmux show-options -gv update-environment))</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> [[ -z <span class="string">"<span class="variable">$TMUX</span>"</span> ]]; <span class="keyword">then</span></span><br><span class="line"> tmux has-session >/dev/null 2>&1 || <span class="built_in">return</span></span><br><span class="line"> <span class="keyword">for</span> var <span class="keyword">in</span> <span class="string">"<span class="variable">${VARS[@]}</span>"</span>; <span class="keyword">do</span></span><br><span class="line"> tmux_global_update_var <span class="string">"<span class="variable">$var</span>"</span></span><br><span class="line"> <span class="keyword">done</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="keyword">for</span> var <span class="keyword">in</span> <span class="string">"<span class="variable">${VARS[@]}</span>"</span>; <span class="keyword">do</span></span><br><span class="line"> tmux_shell_update_var <span class="string">"<span class="variable">$var</span>"</span></span><br><span class="line"> <span class="keyword">done</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">PROMPT_COMMAND=<span class="string">"tmux_update_environment<span class="variable">${PROMPT_COMMAND:+; $PROMPT_COMMAND}</span>"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 自动附加tmux会话(仅在交互式SSH会话中生效)</span></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">command</span> -v tmux &>/dev/null && [[ -n <span class="string">"<span class="variable">$SSH_CONNECTION</span>"</span> && -z <span class="string">"<span class="variable">$TMUX</span>"</span> && $- == *i* ]]; <span class="keyword">then</span></span><br><span class="line"> <span class="keyword">if</span> tmux has-session -t default 2>/dev/null; <span class="keyword">then</span></span><br><span class="line"> <span class="built_in">exec</span> tmux attach -t default</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="built_in">exec</span> tmux new -s default</span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure> |
274 | 275 | <ol start="3"> |
275 | 276 | <li>设置tmux全局变量,自动同步到所有窗口Path</li> |
276 | 277 | </ol> |
277 | | -<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">wtmux set-environment -g KEY VALUE</span><br></pre></td></tr></table></figure> |
| 278 | +<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">tmux set-environment -g NACOS_USERNAME "nacos"</span><br><span class="line"></span><br><span class="line">echo $NACOS_USERNAME</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">应该输出nacos,并且在所有窗口生效</span></span><br></pre></td></tr></table></figure> |
278 | 279 | </div> |
279 | 280 |
|
280 | 281 |
|
|
0 commit comments