如何根据是否设置环境变量来设置和使用 tmux.conf 中的变量

2023-12-30

(免责声明:我完全意识到,我在下面描述的问题有一些解决方案,涉及编写和调用与正在运行的 tmux 服务器交互的 shell 脚本,或者在启动 tmux 服务器之前设置必要的环境变量。我专门发布这个问题看看是否可以解决这个问题without使用此类脚本。)

问题总结

In my .tmux.conf文件,我正在尝试设置一个局部变量VALUE根据环境变量是否有不同的值FOO是否在调用 tmux 之前已设置。然后我想用VALUE在其他 tmux 命令中。不幸的是,我要么无法设置VALUE正确或设置后访问它。

之前的尝试

根据我在手册页和其他包含示例 tmux 代码的问答帖子中找到的内容,有多种方法可以实现上述内容。

尝试1

我首先尝试使用if-shell命令。我尝试在有或没有的情况下使用此命令-b旗帜;两种情况的结果都是一样的。

我从示例中看到我可以使用语法分配变量VALUE=bar。鉴于此,这是我的配置的一个最小示例:

if-shell '[ -z "$FOO" ]' \
    'VALUE=bar' \
    'VALUE=baz'

set-environment -g RESULT $VALUE

终端会话:

$ echo $FOO

$ tmux
[detached (from session 0)]
$ tmux showenv -g VALUE
VALUE=bar
$ tmux showenv -g RESULT
RESULT=
$ killall tmux
$ export FOO=foo
$ echo $FOO
foo
$ tmux
[detached (from session 0)]
$ tmux showenv -g VALUE
VALUE=baz
$ tmux showenv -g RESULT
RESULT=

所以虽然VALUE似乎已正确设置,RESULT似乎无法访问VALUE.

尝试2

联机帮助页还提到可以使用以下命令有条件地执行命令%if声明。使用这种格式,我尝试了以下配置:

%if #{#(if [ -z "$FOO" ]; then echo 1; else echo 0)}
VALUE=bar
%else
VALUE=baz
%endif

set-environment -g RESULT $VALUE

对于表达式中的%if声明,我尝试了几种变体,例如

  • #{#([ -z "$FOO" ])}(我相信这不应该起作用,因为这个命令不会产生任何输出,但值得一试。)
  • #{==:#(if [-z "$FOO" ]; then echo 1; else echo 0),1}(以防万一显式比较有效)

即使有这些变化,无论是否FOO设置与否,我得到以下信息:

$ tmux
[detached (from session 0)]
$ tmux showenv -g VALUE
VALUE=baz
$ tmux showenv -g RESULT
RESULT=baz

因此虽然VALUE是可以访问的,它总是baz.

不幸的是,我找不到有关条件语句中使用的格式的有用示例。联机帮助页描述了如何访问 tmux 变量和一些格式提示;然而,关于访问环境变量,我所能找到的只是使用 shell 命令的方法:

此外,可以使用以下命令插入 shell 命令输出的第一行#()。例如,#(uptime)将插入系统的正常运行时间。构造格式时,tmux 不会等待#()命令完成;相反,使用运行相同命令的先前结果,或者如果之前未运行过该命令,则使用占位符。

我不确定这是否意味着我需要调用命令#()两次以避免使用占位符值,这对我来说可能是一个错误。

我也无法找到打印结果的方法#{}命令可以轻松地调试这部分语句。

问题总结

虽然我很感激任何可以帮助我解决这个问题的信息,但对我来说最紧迫的问题是:

  • Why is VALUE设置正确,但无法访问RESULT在尝试 1 中?
  • 我的条件应该如何写在尝试 2 中以确保VALUE设置正确吗?

tmux 运行配置的方式是将配置文件解析为一组命令,然后执行它们(有一个命令队列,因此配置文件被解析并附加到队列中,然后从队列中执行)。因此有不同的解析和执行步骤。

尝试 1 时遇到的问题是 if-shell 在执行时运行,但 $VALUE 扩展发生在解析时。解析 set-environment 命令时未设置 VALUE。

在尝试 2 中,#() 不会在 %if 内处理,因此不起作用。但是,您可以直接在格式中使用该变量(如果已设置)。 %if 发生在解析时。

因此,您需要确保分配和扩展按正确的顺序进行。你有几个选择。

您可以使 tmux 在命令执行时而不是解析时扩展变量。您可以通过将 setenv 包装在 run-shell 内来完成此操作,例如:

   if-shell '[ -z "$FOO" ]' \
       'VALUE=bar' \
       'VALUE=baz'
   run 'tmux setenv -g RESULT $VALUE'

或者您可以在解析时进行分配,就像您在尝试 2 中尝试的那样,但您不能使用 #() - 您需要使用一种格式:

   %if #{==:#{FOO},}
   VALUE=bar
   %else
   VALUE=baz
   %endif
   setenv -g RESULT $VALUE

(请注意,配置文件中的 X=Y 相当于 setenv -g X=Y ,除非它发生在解析而不是执行时 - 两者都设置全局环境。因此您可以摆脱 VALUE 并执行 RESULT=bar 或 setenv - g %if 内的结果栏。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据是否设置环境变量来设置和使用 tmux.conf 中的变量 的相关文章

  • tmux 使用详解

    什么是 tmux tmux 是一个终端复用工具 xff0c 它允许用户在一个终端窗口中创建多个会话 xff0c 并在这些会话之间切换 这使得用户可以在同一终端窗口中同时运行多个命令 xff0c 而不必打开多个终端窗口 安装 tmux 在 L
  • Tmux 入门

    本指南将介绍 Tmux 的安装和基本用法 以帮助您入门和运行 什么是 tmux Tmux 是终端多路复用器的替代品GNU 屏幕 换句话说 这意味着您可以启动 Tmux 会话 然后在该会话中打开多个窗口 每个窗口占据整个屏幕 并且可以分割成矩
  • nohup训练pytorch模型时的报错以及tmux的简单使用

    问题 在使用nohup命令后台训练pytorch模型时 关闭ssh窗口 有时会遇到下面报错 WARNING torch distributed elastic agent server api Received 1 death signal
  • tmux内外vim主题theme不一致

    每次在tmux里边用vim都觉得好丑 明明外边设置theme了 但是到里边就识别不了 在 tmux conf里添加set g default terminal screen 256color 依然不行 解决方案 使用tmux 2 打开tmu
  • 使用活动窗格密码自动更新 tmux 状态栏

    在 tmux 中 状态栏通常显示窗口列表中窗格的当前工作目录 例如 如果我在一个窗口中有两个窗格 并且这两个窗格具有不同的工作目录 是否可以使用我当前关注的窗格的当前工作目录自动更新状态栏 澄清一下 如果我有一个带有两个窗格的窗口 并且第一
  • tmux 绑定分号

    有什么办法可以绑定吗 059 到 tmux 中的命令 默认绑定到last pane 但是 我想将其重新绑定到 select pane R 我尝试将以下内容放入我的 tmux conf 中 但似乎都不起作用 bind 059 select p
  • TMUX 设置会话的环境变量

    我的工作环境是 我有多个项目 并且每个项目中都有许多脚本 这些脚本使用设置为特定于该项目的值的环境变量 我想做的是为每个项目使用单独的 tmux 会话并设置变量 以便为该会话中的所有窗口设置它们 我尝试使用 set environment
  • tmux 使用当前激活的 conda 环境创建新窗格或窗口

    当我使用 tmux 创建新窗格或窗口时 我想使用我刚刚使用的相同 conda 环境 IE 我现在使用名为 conda envXXXenv 我用Ctrl b 要创建一个新窗格 我想要的是新创建的窗格由 conda env 激活XXXenv 事
  • 如何禁用 Tmux 中的键绑定

    使用 Tmux 和 Vim 有时很痛苦 对我来说 冲突之一是Control S 我在 Vim 中使用它来分割打开缓冲区 但是当使用 Tmux 时 嗯 Tmux 用它做了一些愚蠢的事情 我不明白其目的是什么 但基本上 当C s在 Tmux 中
  • 在 tmux 2.4 上如何一次性进入复制模式并开始搜索?

    我正在尝试将 F1 键绑定到 进入复制模式 开始反向搜索 我在网上唯一找到的是 bind key F1 copy mode send key 然而 这似乎不适用于 tmux 2 4 有没有办法让它在所有 tmux 版本上工作 这有效 bin
  • Tmux 边框显示为 x q 而不是线条?

    我无法让 tmux 显示边框线 它们是用 x 和 q 创建的 它是一个 debian squeeze 服务器 区域设置设置为 en US UTF8 我也尝试添加 instructs tmux to expect UTF 8 sequence
  • 为什么这两种情况下putty中tmux的分割线显示不同(xxxxx,qqqqqq)?

    Why the split line of tmux within PuTTY shows different xxxxx qqqqqq in these tow cases If I do not set PuTTY any thing
  • 无法获取用于 tmux 和 OSX 的删除键

    在通过自制软件安装了 tmux 的 OSX 上 我似乎无法让 删除 键起作用 我正在使用 iterm2 并将删除映射到 H 如果没有 tmux 删除 键可以正常工作 修复 Apple M1 Pro OSX 12 4 tmux 3 3a 上的
  • 如何将vim(通过tmux)绑定到Cmd键

    我通常使用 macvim 并且使用 macs 命令键有许多键绑定 我正在尝试切换到 tmux 但这些绑定都不起作用 有关如何修改我的 tmux config 或 vimrc 以恢复这些绑定的任何提示 你是否有机会使用
  • 当在 tmux 会话中打开的 vim 进程上移动光标时,为什么它时不时地会留下幽灵字符的痕迹 - ^[OB,^[OA?

    如果我向上翻页和向下翻页 这些就会消失 为什么会发生这种情况以及如何纠正 https i stack imgur com DnMYl png https i stack imgur com DnMYl png 我最近摆弄了我的 vimrc
  • 如何创建布局并在 tmux 启动时运行命令?

    我正在尝试编写一个可以运行 源的脚本 以便 tmux 设置特定的布局并运行命令 我有一些结果 这是我到目前为止所写的内容 selectp t 1 splitw v p 15 splitw h p 50 selectp t 1 send ke
  • 在 Mac OS Lion 上使用 tmux 提示之前出现奇怪的空格

    它刚刚发生在我的 Lion 系统上 我正在使用 zsh 和 tmux 在 zsh shell 中正常 tmux 屏幕中的双倍空间 我是否缺少 zsh 或 tmux 中的某些配置 使用 u 选项启动 tmux 以实现 unicode 功能 看
  • 如何使用 tmuxinator 在 tmux 中拆分水平窗格内的两个垂直窗格

    目前我的 tmuxinator yml 文件中有这个 windows editor layout main horizontal panes vim server rails s 这给了我两个窗口 一个用于编辑器 另一个用于服务器 在编辑器
  • 使用 fzf-tmux 进行快速窗口切换的 tmux 脚本给了我错误的选项

    我编写了以下内容 它允许我使用 fzf 切换 tmux 窗口 tmux list windows F I W fzf tmux cut d f 1 xargs tmux select window t 当我在 shell 中运行它时 它工作
  • 如何在不同目录中启动多个窗口的 tmux?

    我想使用脚本打开一个有 6 个窗口的 tmux 会话 每个窗口位于不同的目录中 我开始于我找到的一个脚本 http blog hawkhost com 2010 07 02 tmux E2 80 93 the terminal multip

随机推荐