我正在尝试根据从父 shell(即 bash)继承的值TERM
在我的环境中为 tmux 会话设置环境变量。请注意,我的so中有以下行,实际上是继承的:.tmux.conf
TERM
.tmux.conf
TERM
set -g update-environment '...some variables... TERM'
基本上,TERM
是xterm-256color
在父 shell 中,我检测到并default-terminal
使用以下命令设置选项:
if "[[ ${TERM} =~ 256color ]]" 'set -g default-terminal screen-256color'
该行在我的工作电脑(RHEL 6.6)上的 tmux 1.9a 中有效并正确设置TERM
为screen-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
的行,然后创建一个新会话,该新会话具有。$TERM
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
...这与预期一致。并且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'