Tmux if-shell 条件始终为 false

vil*_*apx 2 bash tmux

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

set -g update-environment '...some variables... TERM'
Run Code Online (Sandbox Code Playgroud)

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

if "[[ ${TERM} =~ 256color ]]" 'set -g default-terminal screen-256color'
Run Code Online (Sandbox Code Playgroud)

该行在我的工作 PC (RHEL 6.6) 上的 tmux 1.9a 中工作,并正确设置TERMscreen-256color,但在其他 PC 上(包括运行 tmux 1.8 的工作 Ubuntu PC 和运行 tmux 2.1 的家用 Ubuntu PC),“condition”命令始终似乎返回 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
Run Code Online (Sandbox Code Playgroud)

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

为了确认这一点,如果我分离此会话,请编辑.tmux.conf以注释掉检查$TERM/sets的行default-terminal,然后创建一个新会话,该新会话具有TERM = 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
Run Code Online (Sandbox Code Playgroud)

...这正如预期的那样。并TERM适当设置为screen-256color.

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

小智 5

我可能已经回答了您更新前的问题。

正如这里所述:

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

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