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」を表し、^G
ASCII制御文字「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つは、TERM
Qtプログラムが実行されるシェルで環境を設定することです。正常に動作する起動スクリプトは、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ウィンドウのタイトルを設定する制御コードです。