问题
巧合的是,我试图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
. $TERM
vte 中的终端名称( 的值)是xterm-256color
。看如何让光标停止闪烁以获得解释。此命令只会影响新终端,不会影响已经打开的终端。
TERM=xterm-256color infocmp -1 | sed '/^.rs[12]=/ s/,$/\\E[8l,/' | tic -