将转义颜色字符打印到 bash

Print escaped color characters to bash

我正在使用 C 中的 readline 库在 bash 中创建类似 bash 的提示。当我尝试使用 these 之类的颜色序列使提示变得丰富多彩时,着色效果很好,但光标间距却乱七八糟。输入太早环绕并且环绕在同一行所以它开始覆盖提示。我想我应该用 \[\] 来转义颜色序列,比如

readline("\[\e[1;31m$\e[0m\] ")

但这会打印方括号,如果我转义反斜杠,它也会打印方括号。如何转义颜色代码以使光标仍然有效?

告诉 readline 提示字符串中的字符序列在输出到屏幕时实际上不会移动光标的方法是用标记 RL_PROMPT_START_IGNORE 包围它(目前,这是字符文字readline 的 C 头文件中的 '\001')和 RL_PROMPT_END_IGNORE(当前为 '\002')。

正如@Joachim 和@Alter 所说,使用'\033' 而不是'\e' 以实现可移植性。

我在 bash 脚本 中寻找改进 GNU readline 提示 时发现了这个问题。与 C 代码中的 readline 一样,\[\] 并不特殊,但 [=13=]1[=14=]2 可以工作 当通过特殊处理 bash 提供 $'string' 形式的引用词。我以前来过这里(由于不知道将其与 $'…' 结合使用而感到不满意),所以我想既然我有了解决方案,我会在这里留下我的解释。

使用此处提供的数据,我得出了这个结果:

C1=$'[=10=]13[1;34m[=10=]2'   # blue   -  from \e[1;34m
C0=$'[=10=]13[0;0m[=10=]2'    # reset  -  from \e[0;0m
while read -p "${C1}myshell>$C0 " -e command; do
  echo "you said: $command"
done

这会给出一个蓝色提示,上面写着 myshell> 并有一个尾随 space,实际命令没有颜色。点击 Up 或输入和换行到下一行的命令不再被非打印字符混淆。

如已接受的答案中所述,[=13=]1 (Start of Heading) and [=14=]2 (Start of Text) 是 RL_PROMPT_START_IGNORERL_PROMPT_END_IGNORE 标记,告诉 bash 和 readline 不要为了绘制终端,计算它们之间的任何值。 (也在这里找到:3\e 更可靠,而且既然我现在使用八进制代码,我不妨再使用一个。)

这方面的文档似乎非常缺乏;我能找到的最好的是在 perl 的 Term::ReadLine::Gnu 文档中,它说:

PROMPT may include some escape sequences. Use RL_PROMPT_START_IGNORE to begin a sequence of non-printing characters, and RL_PROMPT_END_IGNORE to end the sequence.