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

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

我有一个自定义的 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

答案1

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

\[${COL_USR}\]

或者

COL_USR="\[${COL_Y}${COL_BRIGHT}\]"

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

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

echo ${COL_USR} | hexdump -c

相关内容