linux 如何正确使用/渲染unicode字符来使用$PS1配置bash提示符?

yx2lnoni  于 2022-12-03  发布在  Linux
关注(0)|答案(1)|浏览(208)

我有以下作为我的PS1设置我的bash提示符。但当我键入非常长的命令到终端,行不 Package 好(它继续从同一行,而不是开始一个新的行)。

BROWN='\[\e[38;5;5m\]'
ARROW=$'\xe2\x86\x92'
RESET='\[\e[m\]'
export PS1="[\u@\h \w] $BROWN$ARROW $RESET"

我想在这种风格的代码,因为在未来我可能会有更多的颜色和符号更有趣和复杂的提示,所以使用变量是我的首选方式。
但是即使我用最直接的方式(没有变量)编写PS1如下,换行仍然是错误的。

export PS1="[\u@\h \w] \[\e[38;5;5m\]→ \[\e[m\]"

我认为问题应该来自于使用unicode字符,因为如果我设置PS1时没有使用unicode字符,如下所示(用$替换unicode箭头字符),根本就没有 Package 问题。

export PS1="[\u@\h \w] \[\e[38;5;5m\]\$ \[\e[m\]"

要了解更多信息,我的bash版本是4.2.46(x86_64-redhat-linux-gnu),终端可以很好地呈现我想要使用的unicode字符(使用echo -e '\xe2\x86\x92')。
提前感谢您的帮助!

dldeef67

dldeef671#

对于UTF-8语言环境,Bash将$'\xe2\x86\x92'作为一个字符处理,长度为1。对于C语言环境,它是3个字符的字符串,长度为3(这会使Bash混淆它应该将光标向前移动多远)。我建议您使用UTF-8语言环境。
请参见以下示例:

[bash-5.2] $ locale
LANG=""
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"
[bash-5.2] $ ARROW=$'\xe2\x86\x92'
[bash-5.2] $ declare -p ARROW
declare -- ARROW="→"
[bash-5.2] $ echo ${#ARROW}
1
[bash-5.2] $ export LC_ALL=C
[bash-5.2] $ locale
LANG=""
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL="C"
[bash-5.2] $ ARROW=$'\xe2\x86\x92'
[bash-5.2] $ declare -p ARROW
declare -- ARROW=$'\342\206\222'
[bash-5.2] $ echo ${#ARROW}
3

相关问题