Gnome 终端未正确处理控制字符(\001-\x01 和 \002-\x02)

Gnome 终端未正确处理控制字符(\001-\x01 和 \002-\x02)

重新做同样的问题,希望以新的格式和正确的平台。

我有一台机器(我们给它起个昵称涡流)使用 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[...序列的作用以及它们如何影响布局。)

相关内容