Bash 自定义提示打破长命令行的换行

Mur*_*iar 8 linux bash prompt

我有一个自定义的 bash 提示,它为我的用户名、主机名和当前工作目录着色。颜色显示正确,但是当我键入需要换行的命令行时,终端不会开始新行,而是覆盖命令的开头。这发生在 RHEL 4 和 Debian 上。

这个问题详细说明了 OS X 上的一个类似问题;似乎这是一个错误终止的控制序列的问题,但是我看不出是什么原因造成的,因为我到处都使用 $(tput) 代码,而不是手工编写我的代码。下面的片段 - 有没有人能够建议我做错了什么?

# Control codes

COL_RST=$(tput sgr0)  # Remove all colour formatting
COL_BRIGHT=$(tput bold) # Emphasise

# Foreground
COL_G=$(tput setaf 2) # Green
COL_Y=$(tput setaf 3) # Yello
COL_B=$(tput setaf 4) # Blue

COL_USR=${COL_Y}${COL_BRIGHT}
COL_PWD=${COL_B}${COL_BRIGHT}
COL_HST=${COL_G}${COL_BRIGHT}

# Set prompt
PROMPT="${COL_USR}\u${COL_RST}@${COL_HST}\h${COL_RST}:${COL_PWD}\W${COL_RST}"

# Put it all together....
PS1="[$PROMPT]\$ "

export PS1
Run Code Online (Sandbox Code Playgroud)

Den*_*son 8

将每个颜色变量包装在转义的方括号中:

\[${COL_USR}\]
Run Code Online (Sandbox Code Playgroud)

或者

COL_USR="\[${COL_Y}${COL_BRIGHT}\]"
Run Code Online (Sandbox Code Playgroud)

这告诉 Bash 这些将被视为零宽度。

这与您链接到的问题中描述的完全相同。如果您执行以下命令,您将看到您的变量包含与“手工制作”的字符序列相似的字符序列。使用tput仅使事物可移植到多种$TERM类型,它不会影响代码序列的长度。正是这种长度使事情变得糟糕。

echo ${COL_USR} | hexdump -c
Run Code Online (Sandbox Code Playgroud)