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\]\$ '

가능한 근본 원인 중 하나는 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창 제목을 설정하는 제어 코드입니다.

관련 정보