Tmux if-shell 条件始终为假

Tmux if-shell 条件始终为假

我正在尝试根据从父 shell(即 bash)继承的值TERM在我的环境中为 tmux 会话设置环境变量。请注意,我的so中有以下行,实际上是继承的:.tmux.confTERM.tmux.confTERM

set -g update-environment '...some variables... TERM'

基本上,TERMxterm-256color在父 shell 中,我检测到并default-terminal使用以下命令设置选项:

if "[[ ${TERM} =~ 256color ]]" 'set -g default-terminal screen-256color'

该行在我的工作电脑(RHEL 6.6)上的 tmux 1.9a 中有效并正确设置TERMscreen-256color,但在其他电脑上(包括运行 tmux 1.8 的工作用的 Ubuntu 电脑和我运行 tmux 2.1 的家用 Ubuntu 电脑),'条件'命令似乎总是返回 false,因此TERM仍在screen新的 tmux 会话中。

我也尝试过这样做if 'true' 'set -g default-terminal screen-256color',但也没有用!(TERM仍然screen在新的 tmux 会话中)。

有人能帮我找出我做错的地方吗?或者能提供一些信息来解释为什么它在一台机器上能用,但在另外两台机器上却不行?


更新:

在打开tmux极端详细程度运行之后(tmux -vvvvvvvvvv),我想我看到了这个问题。

查看tmux服务器日志文件(tmux-server-xxxx.log),我看到以下日志行,按此顺序排列(它们之间还有其他行,我已省略):

run job 0x55fbca2e7240: [[ xterm-256color =~ 256color ]], pid 4955
cmdq 0x55fbca2dc250: new-session (client 7)
session 0 created
job died 0x55fbca2e7240: [[ xterm-256color =~ 256color ]], pid 4955

因此看起来好像正在创建新会话shell 命令退出,因此会话选项直到稍后才被设置……但是它正在设置。

为了确认这一点,如果我分离此会话,请编辑以注释掉检查/sets.tmux.conf的行,然后创建一个新会话,该新会话具有。$TERMdefault-terminalTERM = screen-256color

在 RHEL 计算机上,命令按预期运行,但这些日志行以不同的顺序出现:

run job 0x1e82ce0: [[ xterm-256color =~ 256color ]], pid 17656
job died 0x1e82ce0: [[ xterm-256color =~ 256color ]], pid 17656
cmdq 0x1e66850: new-session (client 7)
session 0 created

...这与预期一致。并且TERM适当地设置为screen-256color

我没有指定命令-b的选项if-shell,所以我不确定为什么我的命令似乎在这两台 Ubuntu 机器上在后台执行。我想知道这是否是 tmux 中可能存在的竞争条件?

答案1

我可能已经对您更新前的问题有了答案。

就像声明的那样这里

请注意,tmux 使用 /bin/sh -c 来执行我们指定的 shell 命令。因此,该命令必须符合 POSIX 标准,因此 [[ 形式的测试不能保证可移植。例如,现代 Ubuntu 和 Debian 系统将 /bin/sh 符号链接到 dash。

这就是我的情况。在我用以下方法替换“您的”方法后,一切正常: if-shell "echo $TERM | grep 256color" 'set -g default-terminal screen-256color'

相关内容