Qtカスタム端末プロンプトが歪む問題を解決する方法

Qtカスタム端末プロンプトが歪む問題を解決する方法

Bashをバインドして端末を作成しました。品質プロセス:

// c++ in Qt4.8.7 on CentOS7
process_ptr->start("bash -i", QIODevice::ReadWrite | QIODevice::Append);
// With the "-i" option, interactive bash is able to display the *prompt*

コマンドは次のように入力されます。QCコマンドライン、ご飯を食べる品質プロセス、出力は次に印刷されます。Q一般テキスト編集

標準出力チャネルを標準エラーチャネルとマージしました。

process_ptr->setProcessChannelMode(QProcess::MergedChannels);

問題は、コマンドプロンプト(PS1で設定)が次の場所にあることです。Q一般テキスト編集stdoutまたはstderrを表示するために使用されるのは非常に混乱しています。

具体的に印刷されるのはQ一般テキスト編集次のように:

^[]0;eng@hostname:~^G[eng@hostname 15:36:41 #17 ~]$
ls

Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos
^[]0;eng@hostname:~^G[eng@hostname 16:05:12 #18 ~]$
echo $PS1
[\u@\H \t #\# \W]\$
^[]0;eng@hostname:~^G[eng@hostname 16:05:35 #19 ~]$

^[]0;eng@hostname:~^G[eng@hostname 16:05:36 #19 ~]$

PS1を次に設定しました。

PS1="[\u@\H \t #\# \W]\$ "

PS1経由でコマンドプロンプトの後半が[eng@hostname 15:36:41 #17 ~]$正しく設定されているようです。

今、前半戦をどのように取り除くべきかわかりません。 ^[]0;eng@hostname:~^G、これは^[ASCII制御文字「ESC」を表し、^GASCII制御文字「BEL」を表す。

この概念を勉強しました。端末この質問の場合:バインディングでbashを変更した方法品質プロセスラインルールとptyをバイパスします。つまり、入出力内容は次のようになります。書き込み/読み取り行ルールとptyを経由せずにbashプロセスに直接入ります(ここにリンクがあります。便利です:ターミナル/ターミナル)

現在の問題の根本原因を見つけるためにどのモジュールを調べるべきかわかりません:stdout / errorチャンネルリダイレクト、bashの基本、Q一般テキスト編集Qtなどから

あなたの大切なコメントや解決策に心から感謝します!

答え1

.profileお使いのシステムに(または.bash_profile誤って)修正された.bashrcコンテンツがある可能性がありますPS1。たとえば、私のシステムでは、bash -ix -c true 2>&1 | grep PS1= | cat -v次のように表示されます。

+ PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
++ PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
+ PS1='\[^[[1m^[[32m\]\u@\h\[^[[39;49m\]:\[^[[34m\]\w\[^[(B^[[m\]\$ '
+ PS1='\[\033]0;\u@\h: \w\007\]\[^[[1m^[[32m\]\u@\h\[^[[39;49m\]:\[^[[34m\]\w\[^[(B^[[m\]\$ '

考えられる根本的な原因の1つは、TERMQtプログラムが実行されるシェルで環境を設定することです。正常に動作する起動スクリプトは、tput正しいエスケープシーケンスを見つけるために同様の方法を使用するため、TERM=dumbシェルプロセスにエクスポートすると簡単なプロンプトが表示されます。以下を使用してデモできますTERM=dumb bash -ix -c true 2>&1 | grep PS1= | cat -v

+ PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
++ PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
+ PS1='\[\]\u@\h\[\]:\[\]\w\[\]\$ '

私の記憶が正しい場合^[]0;...^G順序は次のとおりです。xtermウィンドウのタイトルを設定する制御コードです。

関連情報