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