终端提示符中出现非打印字符

终端提示符中出现非打印字符

如果没有颜色,我的提示看起来是这样的:

[0] [dimo414@dimo414:/tmp]
$ echo $PS1 | sed 's/\x1b/\\e/g'
\n[0] [dimo414@dimo414:/tmp]\n\$

我添加了一些颜色并\[...\]划定界限:

[0] [dimo414@dimo414:/tmp]
$ echo $PS1 | sed 's/\x1b/\\e/g'
\n[\[\e[32m\]0\[\e[0m\]] [\[\e[34m\]dimo414\[\e[0m\]\[\e[32m\]@dimo414\[\e[0m\]:\[\e[94m\]/tmp\[\e[0m\]]\n\$

原始提示

看起来很棒!但是Bash常见问题解答指出:

\[ \] 仅在您分配 PS1 时才特殊,如果您在提示显示时运行的函数内打印它们,则不起作用。在这种情况下,您需要使用字节 \001 和 \002

\001但是,当我将提示改为使用时\002,我得到了这个(StackExchange 似乎正确地将它们呈现为零宽度字符,但它们在那里):

[0] [dimo414@dimo414:/tmp]
$ echo $PS1 | sed 's/\x1b/\\e/g'
\n[\e[32m0\e[0m] [\e[34mdimo414\e[0m\e[32m@dimo414\e[0m:\e[94m/tmp\e[0m]\n\$

新的、损坏的提示

相同的提示 - 带有\001... \002- 在 OSX 上的 iTerm2 中看起来是正确的。

我正在使用这两个命令来转义颜色序列:

# Previously (works)
printf '\[%s\]' "$(color "$@")"

# Currently (doesn't work on Ubuntu)
printf '\001%s\002' "$(color "$@")"

为了在 Ubuntu 上使用\001... ,我应该做什么而不是第二个选项?\002

相关内容