Tmux if-shell 條件始終為 false

Tmux if-shell 條件始終為 false

我正在嘗試根據從父 shell(即 bash)繼承的值來設定我的TERMtmux 會話的環境變數。請注意,我的文件中有以下行,因此實際上會被繼承:.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'

該行在我的工作 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

所以看起來好像正在創建新會話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'

相關內容