터미널에서 가끔 ^C와 같은 특수 문자가 표시되는 이유는 무엇입니까?

터미널에서 가끔 ^C와 같은 특수 문자가 표시되는 이유는 무엇입니까?

터미널에서 GUI 프로그램을 실행하고 Ctrl+ 를 입력하면 C터미널에서 에코가 표시됩니다.

^C

신호는 애플리케이션(및 터미널에서 처리하는 키)에 전달됩니다. 캐릭터에 메아리가 있는 이유는 무엇입니까?

답변1

실행하면 터미널 설정일 뿐이며 기본적으로 입력한 모든 내용이 에코됩니다.

stty -ctlecho

이제 터미널은 이러한 문자를 표시하지 않도록 설정되었습니다.

man stty | less +/ctlecho

[-]ctlecho는
모자 기호의 제어 문자('^c')를 에코합니다.

이 구성을 영구적으로 만들려면 *rc 파일에 추가하세요. ( ~/.bashrc또는 유사).

stty설정을 나열하려면 명령을 개별적으로 입력하면 됩니다.

답변2

이 문자는 ECHO터미널 설정에서 플래그를 켰기 때문에 에코되며 에코됩니다.^C 형식당신 때문에반품ECHOCTL깃발을 걸어보세요 . 대부분의 시스템에서는 두 플래그가 모두 기본적으로 켜져 있습니다. 소문자 유틸리티를 사용하여 켜거나 끌 수 있습니다 stty(1).

stty -echoctl # turn echoctl off
stty echoctl  # turn echoctl on

termios(3)지침은 Linux 맨페이지를 참조하세요 [1]:

ECHOCTL(POSIX에는 없음)

ECHO이것도 설정되어 있으면TAB, NL, 를 START제외한 터미널 특수 문자 STOP는 로 에코됩니다 ^X. 여기서 ASCII 코드는 특수 문자보다 큽니다 X. 0x40예를 들어, 문자 0x08( BS)는 로 에코됩니다 ^H. [필요 _BSD_SOURCE또는 _SVID_SOURCE]

회전에 주의하세요오직ECHOCTL깃발 을 내리다아니요제어 문자가 반향되는 것을 방지하지만 ^X캐럿 형식이 아닌 원래 형식으로 반향되도록 합니다. 문자가 특별하고 신호(예: ^C-> VINTR-> SIGINT)를 생성한다는 사실은 에코 여부에 어떤 방식으로도 영향을 미치지 않습니다.

대부분의 터미널 에뮬레이터는 어떤 방식으로든 제어 문자를 표시하지 않지만(불행히도) 이를 흥미로운 방식으로 해석할 수 있습니다. 예를 들어, sleep 3600또는 와 같은 명령을 실행 cat > /dev/null하고 다음 줄에서 키를 누르십시오 <Escape>[41m foo<Enter>. 일단 켜면 화면에 인쇄 echoctl되며 특별한 일이 발생하지 않습니다. ^[[41m foo그러나 echoctl꺼지면 터미널은 에코를 <Raw_esc>[41mANSI 색상 이스케이프(아무 것도 표시하지 않음 [41m)로 해석하고 배경을 빨간색으로 바꿉니다.

터미널 에뮬레이터와 해당 설정에 따라 emacs 사용자는 ^N반사적으로 눌러 대체 문자 세트로 전환하고 모든 문자를 선 그리기 물결선으로 바꿀 수 있습니다.

일반적으로 이러한 일이 발생하는 것을 원하지 않으므로 이는 ECHOCTL합리적인 기본값으로 간주될 수 있습니다.


[1] 이 설명은 그다지 정확하지 않습니다.

  • 캐럿으로 에코되는 "터미널 특수 문자"가 아닙니다.제어 문자(ASCII 0x0 - 0x1f0x7f), 특수 여부. Q" 터미널 특수 문자"를 정의하는 경우 VINTR(기본 문자를 ^C로 대체), 여전히 또는 대신 , stty intr Q로 에코됩니다 .Q^Qchr(0x91)

  • Linux에서 이 플래그가 설정되면 에코( 또는 다른 형식) VEOF가 없습니다 . 하지만 그것은^DICANON~ 할 것이다이 경우 *BSD 및 MacOS에서도 에코됩니다.

  • ASCII 0x7f( DEL)는 char + 0x40(설명된 대로) 로 표시되지 않고 char ^ 0x40( ^?)로 표시됩니다. 다른 모든 사람들과 마찬가지로 btw ;-)

답변3

Unix 스타일 터미널 연결은 원래 훨씬 느린(9600bps 이하) 연결을 위해 개발되었으며 아마도 전화 접속 모뎀 회선을 통해 전송 오류가 발생할 수 있습니다. 에코 기능은 애플리케이션이 입력을 받기 전에 TTY 드라이버에 의해 생성되지만, 애플리케이션은 필요한 경우 에코 기능을 비활성화할 수 있습니다.

로드가 많은 서버 및/또는 느린 연결을 통해 연결할 때 모든 문자를 에코하면 문자가 올바르게 수신되었다는 피드백을 제공합니다. 따라서 이를 보면 ^C원격 컴퓨터가 Ctrl+ 키 누르기를 올바르게 수신했음을 알 수 있습니다. C당장 추가 답변을 받지 못한다면 이제 문제는 의사소통이 아니라는 사실을 알게 될 것입니다.

예를 들어, 시스템이 너무 바빠서 새 명령 프롬프트를 즉시 표시할 수 없거나, 중단된 프로그램이나 스크립트에 종료하기 전에 일부 작업(예: 저장되지 않은 데이터 백업)을 수행하거나 중단 신호를 무시하는 SIGINT 처리기가 있을 수 있습니다. 완전히.

관련 정보