Skip to content

Commit 7deed5e

Browse files
committed
Site updated: 2025-04-20 09:47:32
1 parent 974b741 commit 7deed5e

3 files changed

Lines changed: 121 additions & 119 deletions

File tree

ComputerScience/基本操作/tmux使用/index.html

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<meta property="og:description" content="参考教程: https:&#x2F;&#x2F;www.ruanyifeng.com&#x2F;blog&#x2F;2019&#x2F;10&#x2F;tmux.html tmux使会话与窗口解绑,一个窗口source .bashrc更新了,另一个窗口可能没有 ctrl+b 前缀键 % 分成左右两栏 &quot; 分成上下两栏 up 选择上边的窗口 [ 查看历史记录 窗口 &lt;C-d&gt; 删除窗口 &lt;C-b&gt; z">
2929
<meta property="og:locale" content="zh_CN">
3030
<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">
3232
<meta property="article:author" content="SIMULEITE">
3333
<meta property="article:tag" content="基本操作">
3434
<meta name="twitter:card" content="summary">
@@ -223,7 +223,7 @@ <h1 class="post-title" itemprop="name headline">
223223
<i class="far fa-calendar-check"></i>
224224
</span>
225225
<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>
227227
</span>
228228

229229

@@ -264,17 +264,18 @@ <h1 id="tmux-path-双向绑定"><a class="markdownIt-Anchor" href="#tmux-path-
264264
下面的脚本会帮助我们解决问题,它将tmux白名单内的全局变量值自动同步到Shell环境变量。</p>
265265
<span id="more"></span>
266266
<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>
268269
</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">&#x27;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&#x27;</span><br><span class="line">set -g update-environment &quot;NACOS_USERNAME NACOS_PASSWORD&quot;</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">&#x27;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">&#x27;</span><br></pre></td></tr></table></figure>
270271
<ol start="2">
271272
<li>接着编写<code>~/.bashrc</code>同步脚本,下面的脚本兼容了自动打开tmux操作。</li>
272273
</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>() &#123;</span><br><span class="line"> <span class="built_in">local</span> SESSION_NAME=<span class="string">&quot;<span class="variable">$&#123;1:-default&#125;</span>&quot;</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">&quot;<span class="variable">$1</span>&quot;</span> == <span class="string">&quot;attach&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line"> tmux attach -t <span class="string">&quot;<span class="variable">$SESSION_NAME</span>&quot;</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> tmux new-session -AD -s <span class="string">&quot;<span class="variable">$SESSION_NAME</span>&quot;</span> <span class="string">&quot;<span class="variable">$@</span>&quot;</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line">&#125;</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>() &#123;</span><br><span class="line"> <span class="built_in">local</span> VAR=<span class="string">&quot;<span class="variable">$1</span>&quot;</span></span><br><span class="line"> <span class="built_in">local</span> VALUE=<span class="string">&quot;<span class="variable">$2</span>&quot;</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> [[ -z <span class="string">&quot;<span class="variable">$VALUE</span>&quot;</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">&quot;<span class="variable">$VAR</span>&quot;</span> &amp;&gt;/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">&quot;<span class="variable">$VAR</span>&quot;</span> <span class="string">&quot;<span class="variable">$VALUE</span>&quot;</span> &amp;&gt;/dev/null</span><br><span class="line">&#125;</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>() &#123;</span><br><span class="line"> <span class="built_in">local</span> VAR=<span class="string">&quot;<span class="variable">$1</span>&quot;</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">&quot;<span class="variable">$VAR</span>&quot;</span> 2&gt;/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">&quot;<span class="variable">$TMUX_OUTPUT</span>&quot;</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">&quot;<span class="variable">$VAR</span>&quot;</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line">&#125;</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>() &#123;</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 &amp;&gt;/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 &lt; &lt;(tmux show-options -gv update-environment | <span class="built_in">tr</span> <span class="string">&#x27; &#x27;</span> <span class="string">&#x27;\n&#x27;</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">&quot;<span class="variable">$TMUX</span>&quot;</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">&quot;<span class="variable">$&#123;VARS[@]&#125;</span>&quot;</span>; <span class="keyword">do</span></span><br><span class="line"> tmux_global_update_var <span class="string">&quot;<span class="variable">$var</span>&quot;</span> <span class="string">&quot;<span class="variable">$&#123;!var&#125;</span>&quot;</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">&quot;<span class="variable">$&#123;VARS[@]&#125;</span>&quot;</span>; <span class="keyword">do</span></span><br><span class="line"> tmux_shell_update_var <span class="string">&quot;<span class="variable">$var</span>&quot;</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">&#125;</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">&quot;tmux_update_environment; <span class="variable">$PROMPT_COMMAND</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">command</span> -v tmux &amp;&gt; /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">&quot;<span class="variable">$SSH_CONNECTION</span>&quot;</span> ] &amp;&amp; [ -z <span class="string">&quot;<span class="variable">$TMUX</span>&quot;</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&gt;/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&#x27;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>() &#123;</span><br><span class="line"> <span class="built_in">local</span> SESSION_NAME=<span class="string">&quot;<span class="variable">$&#123;1:-default&#125;</span>&quot;</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">&quot;<span class="variable">$SESSION_NAME</span>&quot;</span> <span class="string">&quot;<span class="variable">$@</span>&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">tmux_global_update_var</span></span>() &#123;</span><br><span class="line"> <span class="built_in">local</span> VAR=<span class="string">&quot;<span class="variable">$1</span>&quot;</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">&quot;<span class="variable">$2</span>&quot;</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">$&#123;VAR&#125;</span> ]]; <span class="keyword">then</span></span><br><span class="line"> VALUE=<span class="string">&quot;<span class="variable">$&#123;!VAR&#125;</span>&quot;</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> tmux set-environment -gru -- <span class="string">&quot;<span class="variable">$VAR</span>&quot;</span> &gt;/dev/null 2&gt;&amp;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">&quot;<span class="variable">$VAR</span>&quot;</span> <span class="string">&quot;<span class="variable">$VALUE</span>&quot;</span> &gt;/dev/null 2&gt;&amp;1</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">tmux_shell_update_var</span></span>() &#123;</span><br><span class="line"> <span class="built_in">local</span> VAR=<span class="string">&quot;<span class="variable">$1</span>&quot;</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">&quot;<span class="variable">$VAR</span>&quot;</span> 2&gt;/dev/null); <span class="keyword">then</span></span><br><span class="line"> <span class="built_in">eval</span> <span class="string">&quot;<span class="variable">$TMUX_OUTPUT</span>&quot;</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">&quot;<span class="variable">$VAR</span>&quot;</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">tmux_update_environment</span></span>() &#123;</span><br><span class="line"> <span class="built_in">command</span> -v tmux &gt;/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">&quot;<span class="variable">$TMUX</span>&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line"> tmux has-session &gt;/dev/null 2&gt;&amp;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">&quot;<span class="variable">$&#123;VARS[@]&#125;</span>&quot;</span>; <span class="keyword">do</span></span><br><span class="line"> tmux_global_update_var <span class="string">&quot;<span class="variable">$var</span>&quot;</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">&quot;<span class="variable">$&#123;VARS[@]&#125;</span>&quot;</span>; <span class="keyword">do</span></span><br><span class="line"> tmux_shell_update_var <span class="string">&quot;<span class="variable">$var</span>&quot;</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">&#125;</span><br><span class="line"></span><br><span class="line">PROMPT_COMMAND=<span class="string">&quot;tmux_update_environment<span class="variable">$&#123;PROMPT_COMMAND:+; $PROMPT_COMMAND&#125;</span>&quot;</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 &amp;&gt;/dev/null &amp;&amp; [[ -n <span class="string">&quot;<span class="variable">$SSH_CONNECTION</span>&quot;</span> &amp;&amp; -z <span class="string">&quot;<span class="variable">$TMUX</span>&quot;</span> &amp;&amp; $- == *i* ]]; <span class="keyword">then</span></span><br><span class="line"> <span class="keyword">if</span> tmux has-session -t default 2&gt;/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>
274275
<ol start="3">
275276
<li>设置tmux全局变量,自动同步到所有窗口Path</li>
276277
</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 &quot;nacos&quot;</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>
278279
</div>
279280

280281

0 commit comments

Comments
 (0)