Bash

bash $PS1 中的顏色程式碼在 tmux 中不起作用

  • September 11, 2018

我在我的中設置了一個彩色提示.bash_profile

export PS1="\[\033[0:33m\]testprompt@\h\[\033[00m\] "

在 tmux 之外,我得到一個彩色提示閱讀testprompt@hostname

在 tmux 會話中,文本已設置,但提示未著色。其他程序正常輸出顏色。

我在以下位置設置了一個彩色終端.tmux.conf

set -g default-terminal "xterm-256color"

我在 macOS 上使用預設終端。Bash 和 tmux 是 homebrew 包管理器的最新版本。在 tmux 內部和外部執行相同版本的 bash。

以下環境變數在 tmux 內外完全相同:

$ echo $PS1
\[\033[0:33m\]testprompt@\h\[\033[00m\]`
$ echo $TERM
xterm-256color
$ echo $SHELL
/usr/local/bin/bash
$ echo $BASH_VERSION
4.4.23(1)-release

Color 非常適用於 tmux 中的其他命令,例如ls -lagit log. fishshell 在 tmux 中有一個顏色提示。在 tmux 中再次打開一個新bash實例沒有任何區別 - 仍然沒有顏色。.bash_profile正在讀取並$PS1正在設置。提示顏色在螢幕和 tmux 之外的“原始”bash 中工作,而不是在 tmux 中。我錯過了什麼?

雖然您必須始終設置TERM環境變數以匹配您的終端類型是正確的,而不是輕率地錯誤地假設您的終端類型是xterm-*,但這實際上與問題無關,因為TERM環境變數與文字無關嵌入在提示中的控制序列。

問題是您在控制序列中使用子參數,而不是參數。參數由分號分隔;,如 ECMA-48:1991 § 5.4.2 中所述。子參數用冒號分隔:,如 ITU-T T.416:1993 § 13.1.8 中所述。

您的外部終端仿真器顯然是處理子參數的仿真器之一,該仿真器將子參數視為參數。因此CSI 0 : 3 3 m被視為 SGR 0 和 SGR 33。其他終端仿真器對正確處理控制序列更為嚴格,或者尚未實現子參數支持。他們可以將其視為具有子參數 33 的 SGR 0、普通 SGR 0(取第一個數字)或僅 SGR 33(取最後一個數字)。

幾年前,終端仿真器根本不支持子參數,所以這正在發生變化;並且希望最終它們都能正確支持子參數。在這種情況下,您的提示將是完全錯誤的。☺

就個人而言,我更喜歡 Z shell,它可以像%F{yellow}在提示符中一樣使用序列,而不必擔心控制序列是什麼,正確設置它們並將它們標記為非間距。

tmux FAQ指出

tmux 裡面的 TERM 必須是“screen”、“tmux”或類似的(例如“tmux-256color”)。不要費心報告不存在的問題!

xterm-256color不同於tmux-256color.

引用自:https://unix.stackexchange.com/questions/468139