전제 조건
Linux 가상 터미널(tty)은VT102-가상 터미널 하위 시스템 소스 코드.
진짜VT100(거의 비슷해요.VT102)에는 다음과 같은 동작이 있습니다.
- 내부에철사모드에서는 입력한 모든 문자가 먼저 컴퓨터로 전송된 다음 터미널로 반환됩니다. 호스트에서 돌아올 때까지 터미널 화면에는 아무 것도 표시되지 않습니다.
- 이스케이프 시퀀스도 예외는 아닙니다. 호스트에서 반환된 후에만 구문 분석되고 실행됩니다. 즉, 글꼴 색상을 빨간색으로 변경하려면 입력해야 하며
ESC[0;31m
해당 시퀀스가 컴퓨터로 전송되어 다시 반향됩니다.VT102이것을 받아 분석하고 적용하세요. 터미널 글꼴 색상을 변경하는 다른 방법은 없습니다(철사모델). 나는 확실하지 않다VT102글꼴 색상은 다르지만 이는 예시일 뿐입니다.
설명서의 그림:
매뉴얼에서 발췌:
라인/로컬
라인/로컬 기능을 통해 운영자는 터미널을 온라인 또는 로컬(오프라인) 상태로 쉽게 전환할 수 있습니다. 터미널이 온라인 상태이면(ON-LINE 표시등이 켜짐) 키보드에 입력된 모든 문자가 컴퓨터로 직접 전송되고 컴퓨터의 메시지가 화면에 표시됩니다. LOCAL 상태(LOCAL 표시등이 켜져 있음)에서는 터미널이 컴퓨터에서 전기적으로 분리되어 키보드에 입력된 문자가 컴퓨터로 직접 전송되거나 수신되지 않습니다.
출처: VT100 시리즈 비디오 터미널 기술 매뉴얼, 제3판, 1982년 7월.
질문
Linux가 다르게 동작하는 이유는 무엇입니까 tty
?
bash
방해하지 않도록 절전 모드로 설정한 다음 Esc[0;31m
일반 텍스트를 입력하고 가져오면 색상이 변경되지 않으므로 이스케이프 시퀀스는 효과가 없습니다.
몇년 전에도 비슷한 질문을 받았는데요.키보드에서는 이스케이프 시퀀스를 보낼 수 없는데 왜 다른 tty에서는 보낼 수 있나요?, 하지만 이제 이해가 되네요VT102Linux 하위 시스템이 실제 하드웨어 터미널과 달리 왜 그렇게 작동하는지 이해하고 싶습니다.
답변1
우선 이 질문은레트로 컴퓨팅, 하지만 커뮤니티에서는 이 사이트가 이 사이트에 더 적합하다고 판단했습니다. 하지만 댓글 섹션에서 답변을 얻었으므로 여기에 복사했습니다.
Linux Virtual Console은 온라인 모드에서 Linux(직렬) tty 장치에 연결된 (일종의) VT102 터미널을 에뮬레이트합니다. Linux tty 드라이버는 일반적으로 이스케이프된 제어 문자를 에코하지 않습니다.^[. tty 드라이버가 이 작업을 수행하는 것을 원하지 않으면 다음을 사용하십시오.스티크트레키오. 또한 실제 VT102 터미널은 색상을 지원하지 않으며 실제로 VT102와 호환되지 않기 때문에 Linux Virtual Console에서는 작동하지 않습니다.
시도해 보았는데 stty -ctlecho
거의 예상대로 작동합니다. 하위 문제가 하나뿐입니다. 이것이 사실입니다.VT102사람이 이스케이프 시퀀스를 누르고 입력을 시작한 후에도 표시되는 문자가 없으므로 ESC사람이 맹목적으로 입력하고 있습니까?
답변2
매우 긴 질문으로 단순화되었습니다.
Linux tty가 다르게 동작하는 이유는 무엇입니까?
사실 이건 아니지단말기, 그러나 애플리케이션(예:껍데기) 문자가 에코되는 내용과 방법을 제어합니다. 당신은 그것을 사용할 수 있습니다stty
응용프로그램은 일시적으로 터미널 모드를 변경합니다(일부 쉘에서는 다시 변경함). 예를 들어 다음과 같습니다.
stty -cooked
("원시"로 만들면 터미널 드라이버가 방해하지 않게 됩니다.)
답변3
...맹목적으로 들어가다
내 생각엔 우리가 꽤 가까운 것 같아. 문서를 아주 잘 작성하셨습니다. 데모가 누락되었습니다! 예전 Q에서키보드에서 이스케이프 시퀀스 보내기안되는 것만 보여주네요! 제목이 두 개 더 있나요? ? ? 더 명확하게 할 수 있나요? 그리고 나와 같은 스크린샷이 있습니다(위에 링크된 질문에 대한 내 답변에 있음).
누구도 다음 중 하나에 입력해서는 안 됩니다.긴순서맹목적으로. 잘 설정된 VTxxx에는 CS가 저장되는 특수 키와 특수 바인딩, 쉘 기능이 있을 수 있습니다. 이러한 시스템에서는 모든 것이 조정됩니다. Linux와 xterm은 표준에 가까운 유일한 것이기 때문에 이를 모방하고 있습니다.
하지만 그렇습니다. Esc 키는 다음 키가 입력이 아니라 명령임을 의미합니다. 따라서 누군가는 바이트를 예약하고 미리 정의된 시퀀스를 확인해야 합니다.
그러나 시퀀스가 불가능해지면 쉘은 종료 모드를 종료하고 다시 에코를 시작합니다. Esc를 누르고 [를 누른 다음 1,1,1...을 누르면 대괄호와 두 개의 "1"이 손실됩니다.
Escape 후에 입력해 보십시오 [32m
. "m"이 다시 나타납니다. 이는 쉘이 시퀀스를 포기했음을 의미합니다. 쓸모없는 ^[[32는 사라졌습니다. 어딘가에서 사라졌습니다.
bash/readline을 취소하고 tty 작동을 중지하세요. 화면 전체에 컬러 문자(굵게, 밑줄, 깜박임, 보이지 않음)를 넣을 수 있는 어린이용 장난감이 남게 됩니다.
나는 너의 질문을 이해할 수 없다. "에코"Escape Sequence"는 읽기 프롬프트에서 (abc를 입력한 후) 왼쪽 화살표를 사용하려고 할 때와 같이 표시에 맞지 않고 실제로 반영되는 시퀀스입니다.
$ read
abc^[[D
일반 프롬프트에서 "abc"를 입력하고 Escape를 입력한 다음 맹목적으로 "[D"를 입력하면 커서가 왼쪽으로 이동합니다. 화살표 키는 생성하기 더 쉬운 방법입니다.
시퀀스를 진행하려면 echo -e '\e...'
또는 echo '^[...'
(ctrl-V 사용)을 사용하세요. 이런 식으로 쉘은 이스케이프 문자를 보내고 해석(요리?)하지 않습니다.
그리고 당신은 CS를 tty의 얼굴에 바로 던지는 방법 stty -echoctl
도 찾았습니다. sleep 1000
미안: tty야운전사의얼굴.
[여기서 -bash-is-sleeping-and-tty-offguard jpeg 동안 더 나은 색상 변경이 필요합니다...]