(免责声明:我完全知道我在下面描述的问题有解决方案,涉及编写和调用与正在运行的 tmux 服务器交互的 shell 脚本,或者在启动 tmux 服务器之前设置必要的环境变量。我特意发布了这个问题看看是否可以在不使用此类脚本的情况下解决此问题。)
在我的.tmux.conf文件中,我试图VALUE根据FOO在调用 tmux 之前是否设置了环境变量,将局部变量设置为不同的值。然后我想VALUE在其他 tmux 命令中使用。不幸的是,我要么无法VALUE正确设置,要么在设置后访问它。
根据我在联机帮助页和其他包含示例 tmux 代码的问答帖子中找到的内容,有多种方法可以实现上述内容。
我首先尝试使用该if-shell命令。我尝试在带有和不带有-b标志的情况下使用此命令;两种情况下的结果都是一样的。
我从示例中看到,我可以使用语法分配变量VALUE=bar。鉴于此,这是我的配置的一个最小示例:
if-shell '[ -z "$FOO" ]' \
'VALUE=bar' \
'VALUE=baz'
set-environment -g RESULT $VALUE
Run Code Online (Sandbox Code Playgroud)
终端会话:
$ 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=
Run Code Online (Sandbox Code Playgroud)
因此虽然VALUE似乎已正确设置,RESULT但似乎无法访问VALUE.
手册页还提到可以使用%if语句有条件地执行命令。使用这种格式,我尝试了以下配置:
%if #{#(if [ -z "$FOO" ]; then echo 1; else echo 0)}
VALUE=bar
%else
VALUE=baz
%endif
set-environment -g RESULT $VALUE
Run Code Online (Sandbox Code Playgroud)
对于%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
Run Code Online (Sandbox Code Playgroud)
因此,虽然VALUE可以访问,但它总是baz.
不幸的是,我找不到关于条件语句中使用的格式的有用示例。手册页描述了如何访问 tmux 变量和一些格式提示;然而,关于访问环境变量,我能找到的只是一种使用 shell 命令的方法:
此外,shell 命令输出的第一行可以使用
#(). 例如,#(uptime)将插入系统的正常运行时间。构建格式时,tmux 不会等待#()命令完成;相反,使用运行相同命令的先前结果,或者如果之前未运行过该命令,则使用占位符。
我不确定这是否意味着我需要#()两次调用命令以避免使用占位符值,这可能是我的错误。
我也无法找到一种方法来#{}轻松打印命令的结果来调试这部分语句。
虽然我很感激任何可以帮助我解决这个问题的信息,但对我来说最紧迫的问题是:
VALUE设置正确,但RESULT在尝试 1 中无法访问?VALUE正确设置?Nic*_*ott 11
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'
Run Code Online (Sandbox Code Playgroud)
或者您可以像在尝试 2 中尝试的那样在解析时进行分配,但您不能使用 #() - 您需要使用一种格式:
%if #{==:#{FOO},}
VALUE=bar
%else
VALUE=baz
%endif
setenv -g RESULT $VALUE
Run Code Online (Sandbox Code Playgroud)
(请注意,配置文件中的 X=Y 等效于 setenv -g X=Y 除非它发生在解析而不是执行时 - 两者都设置全局环境。因此您可以摆脱 VALUE 并执行 RESULT=bar 或 setenv - g %if 内的结果栏。)
| 归档时间: |
|
| 查看次数: |
5105 次 |
| 最近记录: |