C 将转义颜色字符打印到bash

C 将转义颜色字符打印到bash,c,bash,readline,C,Bash,Readline,我正在使用C中的readline库在bash中创建一个类似于bash的提示符。当我尝试使提示符色彩丰富时,使用类似的颜色序列,颜色效果很好,但光标间距混乱。输入的换行太早,并且换行到同一行,因此它开始覆盖提示。我想我应该用\[和\]之类的方法来避开颜色序列 readline(\[\e[1;3100万美元\e[0m\]) 但这会打印方括号,如果我转义反斜杠,它也会打印。如何转义颜色代码,使光标仍能工作?告诉readline当输出到屏幕时,提示字符串中的字符序列实际上不会移动光标的方法是用标记围绕它

我正在使用C中的readline库在bash中创建一个类似于bash的提示符。当我尝试使提示符色彩丰富时,使用类似的颜色序列,颜色效果很好,但光标间距混乱。输入的换行太早,并且换行到同一行,因此它开始覆盖提示。我想我应该用
\[
\]
之类的方法来避开颜色序列

readline(\[\e[1;3100万美元\e[0m\])


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

告诉readline当输出到屏幕时,提示字符串中的字符序列实际上不会移动光标的方法是用标记围绕它E(当前,这是readline的C头文件中的字符文本'\001')和
RL\u提示符\u结束\u忽略(当前'\002')


正如@Joachim和@Alter所说,为了便于移植,请使用“\033”而不是“\e”。

我在bash脚本中优化GNU readline提示符时发现了这个问题。就像C代码中的readline一样,
\[/code>和
\]
不是特别的,但是
\001
\002
将在通过特殊处理字面上给出时起作用。bash提供了
$'string'
形式的引用词。我以前来过这里(由于不知道如何将其与
$'…'
结合使用,我感到不满意),所以我想我应该把我的解释留在这里,现在我有了一个解决方案

使用此处提供的数据,我能够得出以下结论:

C1=$'\001\033[1;34m\002'#蓝色-来自\e[1;34m
C0=$'\001\033[0;0m\002'#重置-从\e[0;0m
当读取-p“${C1}myshell>$C0”-e命令时;执行
回声“你说:$command”
完成
这将给出一个蓝色提示,提示为
myshell>
,并有一个尾随空格,实际命令没有颜色。点击或输入并换行到下一行的命令不再被非打印字符所混淆

如公认答案中所述,
\001
()和
\002
()是
RL_提示符_开始_忽略
RL_提示符_结束_忽略
标记,它们告诉bash和readline在绘制终端时不要在它们之间计数任何东西。(也可以在这里找到:
\033
\e
更可靠,既然我现在使用的是八进制代码,我还是多用一个吧。)

关于这一点的文档似乎非常缺乏;我能找到的最好的文档是perl的文档,它说:

PROMPT
可能包括一些转义序列。使用
RL\u PROMPT\u START\u IGNORE
开始非打印字符序列,使用
RL\u PROMPT\u END\u IGNORE
结束序列


像那样转义序列是Bash特有的事情。如果从程序打印,则不需要括号。还要注意的是,序列
“\e”
是GCC编译器中的一个扩展,它通常不可移植。为了澄清我之前的评论,我的意思是
“\[”
“\]”
对是特定于Bash的,您不需要它。您是否尝试过使用
readline(\[\033[1;310M$\033[0m\])
\033
而不是
\e