質問

質問

質問

偶然にも、多くの角かっこを含む文字列をSTDOUT印刷しようとしたが、IO時間が多くかかることがわかりました(〜100KBの場合〜4秒)。gnome-terminal文字列に特定の内容があるかどうかを確認するために、文字列の他の長さとは非常に異なる時間を印刷しました。

具体的には:

$ 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バグトラッカーにバグが報告されました。(vteはgnome-terminal、anjuta、deepin-terminal、gtkterm、lilyterm、lxterminal、mate-terminal、remmina、sakura、tilda、vinagre、xfce4-terminalなどで使用される端末エミュレータライブラリです。)基本的なfribidiライブラリのバグ、これは2021年10月現在修正されていません。

回避策:双方向サポートを無効にします。

エグモント提案されたソリューションこれにより双方向サポートが無効になります。明らかに、この回避策はBidiのサポートに興味がない場合にのみ役立ちます。

Gnome Terminalの場合は、各プロファイルに適用する必要がある設定を非表示にしてこれを実行できます。次のコマンドは、アカウントに対してこの操作を永久に実行します。

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'

ただし、これは端末がリセットされるまで持続します。シェルプロンプトに入れると、コマンドラインアプリケーションには役立ちますが、フルスクリーンアプリケーションには役立ちません。バッシュから:

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

zshから:

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

双方向サポートを効果的に無効にするより一般的な端末に依存しない方法は、.vte(値\e[8l)に端末名を含めるように端末のリセット順序を変更することです。バラより$TERMxterm-256colorカーソルの点滅を止める方法説明のために。このコマンドは、すでに開いている端末ではなく、新しい端末にのみ影響します。

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

関連情報