키보드에서는 이스케이프 시퀀스를 보낼 수 없는데 왜 다른 tty에서는 보낼 수 있나요?

키보드에서는 이스케이프 시퀀스를 보낼 수 없는데 왜 다른 tty에서는 보낼 수 있나요?

나는 하나의 tty에서 다른 tty로 쓰기, 설정 변경 tty1등과 같은 다양한 트릭을 수행하여 터미널이 어떻게 작동하는지 이해하려고 노력하고 있습니다. tty2또한 키보드에서 직접 이스케이프 시퀀스를 전송하여 색상을 변경해 보았습니다. 즉, echo -e '\e[0;31m'명령을 통하는 것이 아니라 직접 키보드 입력을 통하는 것입니다. 이것은 작동하지 않습니다.

나는 다음 단계를 수행합니다.

  1. 열고tty1tty2
  2. 절전 모드 tty2진입 중 을 누르세요 . "하나"라는 단어를 입력하세요.bashsleep 10m

여기에 이미지 설명을 입력하세요.

  1. 가서 tty1해보세요 echo -n ^[[0;31m > /dev/tty2. 첫 번째 문자 ^[는 이렇게 입력됩니다 Ctrl+v Esc
  2. 돌아가서 tty2"two"라는 단어를 입력하세요. 예 - 다른 tty의 명령을 통해 색상이 빨간색으로 변경되었습니다.

여기에 이미지 설명을 입력하세요.

  1. 3,4단계를 반복하되 녹색과 "3"이라는 단어를 사용하세요.

여기에 이미지 설명을 입력하세요.

  1. 마지막으로 다른 문자열을 통해 이스케이프 시퀀스를 보내지 않고 tty키보드에서 직접 을 ^[[0;37m입력하여 tty2모든 작업을 동일한 방식으로 수행했습니다 Esc(readline이 절전 모드이므로 +는 필요하지 않음 Ctrl). 그러나 다음을 얻었습니다.v[0;37m

여기에 이미지 설명을 입력하세요.

질문: 왜 이런 일이 발생합니까? 모든 문자는 동일하고 터미널 상태는 동일하지만 한 경우에는 터미널이 이스케이프 시퀀스를 가져오고 다른 경우에는 그렇지 않습니다.


편집하다

이 질문에 대한 답변은 다음과 같습니다.Linux tty에서 해석되지 않는 에코 이스케이프 시퀀스.

답변1

을 실행하면 echo전송됩니다.산출터미널로 가세요. 터미널은 전송된 출력의 색상을 변경하는 것과 같은 이스케이프 시퀀스를 해석합니다. 이러한 이스케이프 시퀀스는 애플리케이션에서 전송하기 위한 것이므로 터미널에서 실행 중인 애플리케이션의 출력에서 ​​인식됩니다. 일반적으로 터미널에서 실행되는 응용 프로그램은 터미널 에뮬레이터(셸)에 의해 시작되고 차례로 시작되는 응용 프로그램이지만, 실행하면 실제로 echo … >/dev/tty2echo"터미널에서 실행 중"입니다(일종의 출력이 터미널로 전달된다는 것이 중요합니다.)

등을 누르면 Esc [전송됩니다입력하다터미널로 가세요. 터미널은 수신하는 입력의 색상을 변경하는 것과 같은 이스케이프 시퀀스를 해석하지 않습니다. 터미널은 입력의 이스케이프 시퀀스를 해석하지만 완전히 다른 목적으로 사용됩니다. 이는 기능 키 누름을 인코딩하는 방법입니다.

키보드 입력과 텍스트 출력은 어떻게 작동합니까?관련 배경지식이 있어야 합니다.

답변2

이는 xorg의 xterm에서도 작동합니다.

stty -echoctl
sleep <a bit>

Escape그런 다음 "죽은" 터미널에서 다음을 누르면 됩니다.

[32m

다음에 누르는 키는 이미 녹색입니다! Ctrl-C를 사용하여 절전 모드를 종료하면 프롬프트가 그대로 유지됩니다...

여기에 이미지 설명을 입력하세요.

이 질문은 매우 구체적인 경우입니다. readline/bash가 혼수 상태에 있는 동안 키보드에서 화면으로 이스케이프 시퀀스를 몰래 보내는 방법입니다.

일반적인 echoctl/ctlecho를 사용하면 sleep쉘이 키 누르기(입력)를 에코 한 후 ^[Esc 키(출력)가 화면에서와 같이 직접 에코됩니다. "CSI(Control Sequence Introducer)"의 특별한 의미가 사라졌습니다.

그러면 (받아들인) 대답이 틀린 것 아닌가요?


여기서는 마치 라인 편집을 중단하고 계속하지 않기로 결정한 것처럼 Ctrl-C를 누르고 커서를 "라인"의 "l" 위에 놓습니다.

$  weird -cmd ^Cne
$  stty -echoctl
$  weird -cmd line
$  # nice but now it looks like it got exec'd

이것이 stty echoctl 옵션의 주요 목적인 것 같습니다.

EscapePress가 aka의 약자 라는 것을 방금 깨달았습니다 . 따라서 tty가 시퀀스를 기다리지 않고 즉시 ^[ 문자를 ECHO하는 것이 논리적입니다. 일반 echoctl이 열린 후에는 echoctl 없이 Home 키가 생성됩니다. 즉, 이후 Home 키가 커서를 배치합니다.control-[^[sleep^[[Hstty -echoctl왼쪽 위내 xterm 화면!

(Bash가 깨어나면 Home 키가 작동합니다: 줄 시작.)

이 두 bind -p줄은 내장/terminfo xterm입니다:

"\eOH": beginning-of-line
"\e[H": beginning-of-line

관련 정보