如何根据是否设置环境变量来设置和使用 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 使用教程 作者 xff1a 阮一峰 URL xff1a http www ruanyifeng com blog 2019 10 tmux html Tmux 1 Tmux 是什么 xff1f 1 1 会话与进程1 2 Tm
  • 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 windows 继承`activate`d anaconda 环境

    为了方便起见 并考虑到activate 环境非常慢 我想激活一个环境 然后启动一个tmux会议 我想要全新的tmuxwindows 也可以激活环境 我想要不同的tmux会话能够支持不同的 anaconda 环境 我该怎么办 是否存在任何不支
  • iTerm 2 不支持 .tmux.conf 中声明的键绑定

    我正在使用最新稳定版本的 iTerm2 2 0 和最新的 Homebrew 版本的 tmux 1 9a 不幸的是 我的键绑定声明于 tmux conf不能在 集成模式 下使用 iTerm2 tmux 组合 即当 iTerm2 接管 tmux
  • tmux:如何打开光标下的文件

    我是 vim 用户并且习惯了gf命令 打开光标下的文件 现在我想问一下 tmux 是否有类似的东西 我可以在 tmux 窗格中导航 并且经常会出现光标下有一个文件路径的情况 现在我希望能够使用 vim 打开光标下的该文件 A 在当前窗口中
  • 如何禁用 Tmux 中的键绑定

    使用 Tmux 和 Vim 有时很痛苦 对我来说 冲突之一是Control S 我在 Vim 中使用它来分割打开缓冲区 但是当使用 Tmux 时 嗯 Tmux 用它做了一些愚蠢的事情 我不明白其目的是什么 但基本上 当C s在 Tmux 中
  • 使用 xclip 后 Tmux 中的键盘快捷键被停用

    我在 tmux conf 中使用以下配置从 xclip 来回复制文本 bind C c run tmux save buffer xclip i sel clipboard bind C v run tmux set buffer xcli
  • Tmux:失去焦点时自动隐藏面板

    我最近开始使用 tmux 进行 Vim 编辑 在 PyCharm 中 我曾经在底部有一个终端 我可以通过几次按键来切换屏幕 我希望 tmux 具有相同的功能 在 Vim 中全屏编辑代码 然后当我需要运行命令时 直接转到屏幕底部的终端窗格 然
  • 在 tmux 下使用 $TERM='screen-256color' 时,HOME 和 END 键不起作用。为什么?

    我已经设置了 tmux TERM被设置为screen 256color正确 这工作正常 并且颜色设置正确 但是它阻止我发送HOME and END终端的密钥 而是打印为F n and H n 我应该补充一点 home 似乎可以在 irssi
  • 具有 tmux 集成的 Iterm2 不使用 .tmux.conf 中的键绑定

    我已经在 iTerm2 中使用 tmux 一段时间了 但我还没有使用 iTerm2 现在附带的 tmux 集成 我开始考虑使用 tmux 集成 因为它允许您在 tmux 内使用 shell 集成 我遇到的问题是在我这样做之后tmux CC我
  • 在 tmux 2.4 上如何一次性进入复制模式并开始搜索?

    我正在尝试将 F1 键绑定到 进入复制模式 开始反向搜索 我在网上唯一找到的是 bind key F1 copy mode send key 然而 这似乎不适用于 tmux 2 4 有没有办法让它在所有 tmux 版本上工作 这有效 bin
  • 可以配置 Tmux 加载 ~/.bashrc 而不是 ~/.bash_profile 吗?

    现在 当我登录 Tmux 时 仅 bash profile被加载 我想要 bashrc改为被呼叫 那可能吗 这个问题与以下无关tmux 要解决它 请确保添加source bashrc to bash profile就是这样 您可以了解更多有
  • 是否可以找到当前正在使用的 tmux 套接字?

    我正在尝试获取当前正在使用的 tmux 套接字列表 但到目前为止我想出的最佳解决方案是签入 tmp tmux 或 TMPDIR 据我所知 即使当前没有 tmux 会话正在使用这些套接字 tmux 也会将这些套接字保留一段时间 因此 我希望有
  • 我该如何将 HOME 键绑定为 tmux 前缀?

    有没有办法在 tmux conf 中执行此操作 如果其他一切都配置正确 那么应该很简单 只需将其放入您的 tmux conf set option g prefix Home 注意 除非您手动 获取 您的 tmux conf 对文件的更改仅
  • tmux:挂起并且不加载,并且不响应任何选项命令

    我已经在 Fedora 的本地空间上从源代码安装了 tmux 到目前为止 它运行良好 但突然无法再运行它 当运行 tmux 时 它就停止了 尝试了不同的命令选项 例如 ls sessions 但没有任何效果 杀死我的用户的所有进程 删除 t
  • 如何创建布局并在 tmux 启动时运行命令?

    我正在尝试编写一个可以运行 源的脚本 以便 tmux 设置特定的布局并运行命令 我有一些结果 这是我到目前为止所写的内容 selectp t 1 splitw v p 15 splitw h p 50 selectp t 1 send ke
  • 如何使用鼠标滚轮在 tmux 面板中启用滚动? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 需要使用鼠标滚轮在 tmux 窗格中启用滚动 我怎样才能得到这些提示 我可以使用它 当然如果它存在的话 鼠标选择窗格打开 option 原
  • 查找PID所属的tmux会话

    我正在使用 htop 所以看看哪些进程占用了大量内存 以便我可以杀死它们 我有很多 tmux 会话和很多类似的流程 如何检查 PID 位于哪个 tmux 窗格中 以便确定我正在杀死我想杀死的东西 鉴于PID下面一行是目标 pid 号 tmu
  • Tmux:如何将功能键绑定到命令?

    如何绑定功能键 例如 F1 它会生成ESC O P 到 tmux 命令 例如 下一个窗口 ctrl B n 上下文 在 mac 上运行的 ssh 进入 Linux 上的 tmux 会话 我压着fn F1在 Mac 键盘上生成ESC O P

随机推荐