在 Bash 提示的函数中转义非打印字符

Mid*_*ing 24 bash ansi prompt

在 Bash 提示(PS1 变量)中,我正在调用一个函数来潜在地向提示添加文本: export PS1="\u@\h \$(my_function) \$ "

但是,提示中的函数包含 ANSI 颜色代码,这些代码会根据函数的输出(有时为红色,有时为绿色)而变化。将 " \["添加到 PS1 变量应该将这些代码转义为非打印,但如果我echo在函数中执行 an ,则 " \[" 会在提示中逐字打印。

如何从函数中转义这些 ANSI 颜色代码以在 bash 提示中使用?

use*_*686 39

readline的图书馆接受\001\002(ASCII SOH和STX)为不可打印的文字分隔符。这些也适用于任何使用readline 的应用程序。

lib/readline/display.c:243bash的源代码:

243 /* Current implementation:
244         \001 (^A) start non-visible characters
245         \002 (^B) end non-visible characters
246    all characters except \001 and \002 (following a \001) are copied to
247    the returned string; all characters except those between \001 and
248    \002 are assumed to be `visible'. */
Run Code Online (Sandbox Code Playgroud)

bash的特异性\[\]其实都是翻译成\001\002y.tab.c:7640


注意:如果您使用bashprintfor echo -e,并且如果您的文本具有\001\002紧接在数字之前,您将遇到一个bash错误,导致它在处理八进制转义时吃掉一位数字太多——也就是说,\00142将被解释为八进制014(后跟 ASCII“2”),而不是正确的八进制 01(后跟 ASCII“42”)。出于这个原因,用十六进制版本\x01\x02替代。