为了防止提示符围绕从右到左的文本扭曲,我想在 bash 提示符中插入一个零宽度 LRM(U200e)。由于这是一个零宽度字符,我的直觉是用 来换行\[<200e>\]
。结果,这实际上导致 bash 在错误的地方换行。当我不使用它时,然后它看起来运行良好。
我不明白。即使 bash 自动检测到此字符为零宽度,用 包裹\[...\]
它也不会造成任何损害。
编辑:所以问题是:什么时候\[...\]
真正需要转义,以及如果转义的字符实际上是零宽度,它怎么可能有害。
答案1
查看帖子 在 Bash 中转义零长度字符. 尤其是 迈克尔·艾伦的回答 我将其复述如下:
\[
一些实用程序(包括 PS1)使用这些序列来表示\001
和\002
控制代码:
\[
=>\x01
或\001
\]
=>\x02
或\002
printf 和 echo 不执行从
\[
到 的转换\001
。所以解决方案是自己进行转换。而不是将零长度字符包装在
\[
:echo "\[\033[1;30m\]foo\[\033[0m\]"
这将输出
\[foo\]
我输出的是实际的控制代码:
echo "\x01\033[1;30m\x02foo\x01\033[0m\x02"
foo
在 PS1 printf 和 echo 上均输出。有关具体示例,请参阅git-radar 上的这个提交。