重新做同样的问题,希望以新的格式和正确的平台。
我有一台机器(我们给它起个昵称涡流)使用 centos 7 和 bash 4.2,gnome 终端3.28.2,只要找到上述控制字符之一就打印损坏的字符。命令输入:
echo -e "\x01\e[0;34mGoodDay\x01\e[0m\x02"
预期输出:
此输出打印在另一台机器上,即通过 ssh 连接到 Eddy 的 Konsole 2.10.5 上。
获得的输出(上涡流):
正如您所看到的,机器是相同的,但输出显然不同。
我尝试的字符是:\x01 \x02
(Hex)、\001 \002
(Oct) 和\[ \]
,但在最后一种情况下,方括号按原样打印,不解释:
我检查了 LANG 变量等,一切似乎都表明 Eddy 本身拥有这些文件/标准的最新版本。
我添加了这些字符(根据这个问题:https://stackoverflow.com/a/19501528/21389760),因此提示(如果我在read -p
命令中使用它)被正确包装,并且任何非打印字符不会占用屏幕上的任何空间。不知怎的,虽然问题只存在于涡流,并且我在网上没有找到任何解决方案。
答案1
这些控制字符根本不打算打印到终端 - 它们旨在由 Readline 库使用前它显示提示,因为它们的目的是帮助 Readline 的宽度计算(正是因为它必须确定提示的宽度没有任何来自终端1的帮助)。
read
因此,它们仅在与(“use Readline”)选项一起使用时才有用-e
,但否则必须从提示中省略它们。
您所看到的是在打印“不可打印”字符时 Konsole 和 GNOME 终端(或特别是 libVTE)之间或多或少的正常行为差异,否则这些字符对终端没有定义的影响,并且不仅仅是 GNOME 终端生成控制字符可见 - 其他终端也可能这样做。
这同样适用于\[
\]
序列——它们就在那里具体来说对于在 PS1 或 PS2 中使用的 Bash(实际上只是将它们转换为\x01
并\x02
在将提示字符串提供给 Readline 库之前),并且在任何其他上下文中没有任何意义。
1(终端不需要这样的帮助,因为它是渲染器并且已经了解包装\e[...
序列的作用以及它们如何影响布局。)