(免责声明:我完全意识到,我在下面描述的问题有一些解决方案,涉及编写和调用与正在运行的 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
设置正确吗?