bash - 如何正确转义bash提示符中的unicode字符

标签 bash unicode prompt

我的 bash 提示有一个特定的方法,假设它看起来像这样:

CHAR="༇ "
my_function="
    prompt=\" \[\$CHAR\]\"
    echo -e \$prompt"

PS1="\$(${my_function}) \$ "

为了解释以上内容,我通过执行存储在字符串中的函数来构建我的 bash 提示符,这是 this question 的结果做出的决定.让我们假装它工作正常,因为它确实工作正常,除非涉及 unicode 字符

我正在尝试找到转义 unicode 字符的正确方法,因为现在它与 bash 行长度混淆。测试它是否损坏的一种简单方法是键入一个长命令,执行它,按 CTRL-R 并键入查找它,然后按 CTRL-A CTRL-E 跳转到行的开头/结尾。如果文本出现乱码,则它无法正常工作。

我已经尝试了几种方法来正确转义函数字符串中的 unicode 字符,但似乎没有任何效果。

像这样的特殊字符:

COLOR_BLUE=$(tput sgr0 && tput setaf 6)

my_function="
    prompt="\\[\$COLOR_BLUE\\] \"
    echo -e \$prompt"

这是我将提示设为函数字符串的主要原因。该转义序列不会混淆行长度,它只是 unicode 字符。

最佳答案

\[...\] 序列表示完全忽略字符串的这一部分,这在您的提示包含零长度序列时很有用,例如更改字符串的控制序列例如,文本颜色或标题栏。但在这种情况下,您正在打印一个字符,因此它的长度不为零。或许您可以解决这个问题,例如,使用无操作转义序列来欺骗 Bash 计算正确的行长度,但听起来这种方式很疯狂。

正确的解决方案是 Bash 中的行长度计算正确地理解 UTF-8(或您正在使用的任何 Unicode 编码)。嗯,你试过没有 \[...\] 序列吗?

编辑: 下面实现了我在下面的评论中提出的解决方案。保存光标位置,然后在 \[...\] 之外打印两个空格,然后恢复光标位置,并在两个空格之上打印 Unicode 字符。这假设字体宽度固定,Unicode 字符宽度加倍。

PS1='\['"`tput sc`"'\]  \['"`tput rc`"'༇ \] \$ '

至少在 OSX 终端,Bash 3.2.17(1)-release,这通过了粗略的 [sic] 测试。

为了透明性和易读性,我忽略了在函数中包含提示功能和颜色编码的要求;这只是将提示更改为字符、空格、美元提示、空格。适应您更复杂的需求。

关于bash - 如何正确转义bash提示符中的unicode字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7112774/

相关文章:

linux - 命令行中的处理器/内核数

linux - 通过 ssh 从最新更改的目录中获取 Tar 文件

c# - 在 td 中的项目符号和文本之间添加空格

c - getchar() 不断读取 '\n' 。到底是怎么回事?

android - 将 android sdk 位置添加到 PATH

arrays - 如何捕获 ls 或 find 命令的输出以将所有文件名存储在数组中?

c - Emacs、xterm、鼠标垫、C、Unicode 和 UTF-8 : Trying to make sense of it all

javascript - 为什么 twemoji 对大多数表情符号 unicode 都失败?

shell - Powershell 中的 $ExecutionContext.SessionState.Path.CurrentLocation 和 $pwd 有什么区别?

在页面显示之前加载 Javascript 提示