问题

问题

问题

巧合的是,我试图STDOUT在其中打印一个gnome-terminal包含很多方括号的字符串,并注意到它花费了大量的 IO 时间(~100KB 约 4 秒)。为了确认该字符串有特定的内容,我打印了另一个长度的字符串,并且时间非常不同。

具体来说:

$ time cat file1
# ... snip ...
real    0m3.968s
user    0m0.004s
sys 0m0.001s

$ time cat file2
# ... snip ...
real    0m0.052s
user    0m0.006s
sys 0m0.001s

$ ls -l file*
-rw-rw-r-- 1 sinan sinan 115441 Dec 19 16:38 file1
-rw-rw-r-- 1 sinan sinan 115441 Dec 19 16:38 file2

我无法判断速度放缓的原因是什么,我怀疑gnome-terminal解析方括号中的某些内容并赋予它们特殊的含义。有人有什么主意吗?

版本信息

  • gnome-terminal --version:GNOME Terminal 3.36.2 using VTE 0.60.3 +BIDI +GNUTLS +ICU +SYSTEMD
  • bash --version:GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)

答案1

埃格蒙特在 vte bug tracker 上报告了该 bug(vte 是 gnome-terminal、anjuta、deepin-terminal、gtkterm、lilyterm、lxterminal、mate-terminal、remmina、sakura、tilda、vinagre、xfce4-terminal 等使用的终端仿真器库)。原来是底层 fribidi 库中的错误,截至 2021 年 10 月尚未修复。

解决方法:禁用双向支持

埃格蒙特也建议解决方法这是禁用双向支持。显然,只有当您不关心 Bidi 支持时,该解决方法才有帮助。

对于 Gnome 终端,您可以通过隐藏设置来完成此操作,该设置必须应用于每个配置文件。以下命令会为您的帐户永久执行此操作:

for p in $(dconf list /org/gnome/terminal/legacy/profiles:/); do dconf write /org/gnome/terminal/legacy/profiles:/${p%/}/enable-bidi false; done

对于任何使用 vte 的终端,您可以暂时禁用 bidi 支持

printf '\e[8l'

但这只会持续到终端重置为止。如果将其放入 shell 提示符中,它将对命令行应用程序有所帮​​助,但对全屏应用程序没有帮助。在bash中:

PS1='\[\e[8l\]'$PS1

在 zsh 中:

PS1='%{\e[8l%}'$PS1

有效禁用双向支持的更通用的独立于终端的方法是更改​​终端的重置序列以包含\e[8l. $TERMvte 中的终端名称( 的值)是xterm-256color。看如何让光标停止闪烁以获得解释。此命令只会影响新终端,不会影响已经打开的终端。

TERM=xterm-256color infocmp -1 | sed '/^.rs[12]=/ s/,$/\\E[8l,/' | tic -

相关内容