gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:17:23 30 4
gpt4 key购买 nike

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

问题总结

在我的 .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

终端 session :
$ 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 命令的方法:

    In addition, the first line of a shell command's output may be inserted using #(). For example, #(uptime) will insert the system's uptime. When constructing formats, tmux does not wait for #() commands to finish; instead, the previous result from running the same command is used, or a placeholder if the command has not been run before.



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

    我也找不到打印 #{} 的结果的方法。命令很容易调试这部分语句。

    问题总结

    虽然我会很感激任何可以帮助我解决这个问题的信息,但对我来说最紧迫的问题是:
  • 为什么是 VALUE设置正确,但 RESULT 无法访问在尝试 1 中?
  • 我的条件应该如何写在尝试 2 中以确保 VALUE设置正确吗?
  • 最佳答案

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

    您在尝试 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 内的结果栏。)

    关于tmux - 如何在 tmux.conf 中根据是否设置环境变量来设置和使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55838828/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com