터미널 에뮬레이션의 대체 문자 세트

터미널 에뮬레이션의 대체 문자 세트

때로는 실수로 cat일부 바이너리 데이터를 사용하기도 합니다. 때때로 일부 ncurses 프로그램이 충돌합니다. 여러 가지 이유로 터미널이 잘못된 상태로 끝날 수 있으며 수동 작업이 필요합니다 reset. 이런 일이 너무 자주 일어나고 있습니다.

이러한 나쁜 상태는 에코가 없거나 모든 것을 중국 쓰레기로 변환하거나 다른 많은 것들이 될 수 있습니다.

쉘이 제어권을 다시 얻었을 때 터미널(하드 리셋, 화면 정리 등 없이) 설정이 복원되었는지 확인하는 쉬운 방법이 있습니까?

하지만 저는 이 문제가 거의 보편적이라고 생각합니다 bash.Terminal.app

답변1

당신이 언급한 문제는 여러 계층에서 발생하며 그 중 일부만 "이스케이프 코드"로 해결될 수 있습니다.

터미널 에뮬레이션의 대체 문자 세트

"(일부) 소문자가 기호 또는 선 그리기 문자로 표시됩니다"라고 설명할 수 있는 일반적인 터미널 문제가 있습니다.이 다른 SO 질문). 이것은 귀하의 "중국 쓰레기" 문제와 관련이 없을 수도 있지만 제가 본 것 중 가장 가까운 것입니다. 거의 모든 8비트 데이터 스트림을 UTF-16으로 인코딩된 텍스트로 해석할 때 "중국어 쓰레기"에 직면할 수도 있습니다. 일반적으로 이는 재설정이 필요한 "고착된" 문제가 아니므로 현재 보고 있는 문제가 아닐 수도 있습니다.

"선 그리기 문자로 인해 멈춤" 문제는 일반적으로 터미널 에뮬레이터에 의도하지 않은 제어 시퀀스를 보내는 것(또는 대체 문자 집합으로 전환한 후 터미널을 재설정하기 전에 프로그램을 중지하는 것)에서 발생합니다. 이는 일부 이진 데이터가 표시되고 바이트 스트림에 대체 문자 집합을 선택하는 터미널 제어 시퀀스가 ​​포함된 경우 발생할 수 있습니다.

이는 단일 바이트(0x0e, 참조)만 필요하므로 대부분의 VT-100 스타일 터미널에서 쉽게 트리거할 수 있습니다.이전에 링크된 SO 질문에 대한 내 대답). 이 조건을 재설정하는 제어 시퀀스도 단일 바이트(0x0f; 종종 ++ echo ^V^O로 입력되거나 직접 입력됨 ) 를 통해 생성됩니다 . echo ControlV ControlOprintf '\017'

0x0f 바이트를 포함하도록 프롬프트를 표시하면 ** 이러한 유형의 문제를 해결할 수 있습니다 .
** 귀하의 "중국 쓰레기"가 다른 문제로 인해 발생하는 경우 다른 해결책이 있을 수 있습니다.

PS1="\[\017\]… "

그리고 거기 \[\]말할 것이 있습니다세게 때리다제한된 문자는 인쇄되지 않습니다. 이렇게 하면세게 때리다"물리적" 커서 위치에 대한 정확한 정보를 유지하십시오. 이는 명령줄 편집 기능을 사용할 때 적절한 다시 표시를 위해 중요합니다.


Ignacio Vazquez-Abrams가 지적했듯이그의 대답, 원하는 제어 시퀀스를 얻는 또 다른 방법은입력명령:

tput rmacs

이 방법을 사용하면 PS1 수정을 방지하고 PROMPT_COMMAND에 위 명령을 입력할 수 있습니다.

PROMPT_COMMAND='tput rmacs'

TTY(termios) 옵션

"에코 없음" 문제 ***는 터미널 창 내에서 실행되는 모든 프로그램에 터미널 에뮬레이터를 연결하는 OS 기반 tty 장치에 대한 옵션의 예기치 않은 설정으로 인해 발생합니다. 이는 종종 버그가 있거나 충돌이 발생하거나 종료되어 tty를 원래 상태로 복원할 수 없는 대화형 텍스트 UI 프로그램으로 인해 발생합니다.

다음을 사용하여 이러한 설정을 제어할 수 있습니다.stty명령. 이러한 유형의 문제는 tty 옵션이 소프트웨어 API를 통해 구성되므로 "이스케이프 코드"로는 해결할 수 없습니다(참조:tcsetattr(3)그리고테미오스(4)). 일반적 stty sane으로 좋은 재설정 메커니즘입니다.
*** 또한 "^C/^Z/^/ 없음", "계단형 출력"(LF를 수신할 때 자동 CR 없음) 및 기타 여러 문제가 있습니다.

초기화

그만큼초기화명령은 일반적으로 두 가지 유형의 문제 모두에 도움이 될 수 있습니다. 일반적으로 대체 문자 집합 문제를 해결하는 터미널 초기화 제어 시퀀스를 보내고 tty 옵션을 합리적인 값으로 재설정합니다.

문제는초기화일부 시스템에서는 추가 메시지도 인쇄합니다(예: "Erase is...", "Interrupt is..."). 모든 프롬프트 앞에 이러한 항목이 표시되는 것을 원하지 않을 수도 있습니다. 구현하는 경우초기화메시지와 제어 시퀀스를 다른 위치로 보냅니다(예: 하나는 stdout으로 이동하고 다른 하나는 stderr로 이동). 그러면 메시지를 필터링할 수 있습니다(예: PROMPT_COMMAND='reset 2>/dev/null'아래 참조). ^O를 프롬프트에 넣는 것을 건너뛸 수 있습니다.

^O 그리고stty sane

~ 안에세게 때리다PROMPT_COMMAND, 매개변수를 명령으로 설정할 수 있으며세게 때리다기본 프롬프트를 표시하기 전에 실행됩니다. 거기 에 모든 통화를 넣고 stty sane프롬프트에 ^O를 넣을 수 있습니다.

PROMPT_COMMAND='stty sane'
PS1="\[\017\]… "

다시 말하지만, 다음을 사용하면 PS1 수정을 방지하고 VT-100 스타일이 아닌 터미널을 처리할 수 있습니다.입력(Ignacio Vazquez-Abrams가 제안한 대로):

PROMPT_COMMAND='stty sane; tput rmacs'

답변2

놓다

echo -n "$(tput rmacs)"

안에 $PROMPT_COMMAND.

답변3

따라서 나는 명령줄을 덜 사용하게 될 것입니다. xterm이나 모든 터미널에는 항상 "버튼" 재설정 또는 하드 재설정이 있습니다. Terminal.app의 경우 Shell 메뉴 아래에 있습니다. 하드 리셋 alt-command-r을 보냅니다.

관련 정보