터미널에서 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>[41m
ANSI 색상 이스케이프(아무 것도 표시하지 않음 [41m
)로 해석하고 배경을 빨간색으로 바꿉니다.
터미널 에뮬레이터와 해당 설정에 따라 emacs 사용자는 ^N
반사적으로 눌러 대체 문자 세트로 전환하고 모든 문자를 선 그리기 물결선으로 바꿀 수 있습니다.
일반적으로 이러한 일이 발생하는 것을 원하지 않으므로 이는 ECHOCTL
합리적인 기본값으로 간주될 수 있습니다.
[1] 이 설명은 그다지 정확하지 않습니다.
캐럿으로 에코되는 "터미널 특수 문자"가 아닙니다.제어 문자(ASCII
0x0 - 0x1f
및0x7f
), 특수 여부.Q
" 터미널 특수 문자"를 정의하는 경우VINTR
(기본 문자를^C
로 대체), 여전히 또는 대신 ,stty intr Q
로 에코됩니다 .Q
^Q
chr(0x91)
Linux에서 이 플래그가 설정되면 에코( 또는 다른 형식)
VEOF
가 없습니다 . 하지만 그것은^D
ICANON
~ 할 것이다이 경우 *BSD 및 MacOS에서도 에코됩니다.ASCII
0x7f
(DEL
)는char + 0x40
(설명된 대로) 로 표시되지 않고char ^ 0x40
(^?
)로 표시됩니다. 다른 모든 사람들과 마찬가지로 btw ;-)
답변3
Unix 스타일 터미널 연결은 원래 훨씬 느린(9600bps 이하) 연결을 위해 개발되었으며 아마도 전화 접속 모뎀 회선을 통해 전송 오류가 발생할 수 있습니다. 에코 기능은 애플리케이션이 입력을 받기 전에 TTY 드라이버에 의해 생성되지만, 애플리케이션은 필요한 경우 에코 기능을 비활성화할 수 있습니다.
로드가 많은 서버 및/또는 느린 연결을 통해 연결할 때 모든 문자를 에코하면 문자가 올바르게 수신되었다는 피드백을 제공합니다. 따라서 이를 보면 ^C
원격 컴퓨터가 Ctrl+ 키 누르기를 올바르게 수신했음을 알 수 있습니다. C당장 추가 답변을 받지 못한다면 이제 문제는 의사소통이 아니라는 사실을 알게 될 것입니다.
예를 들어, 시스템이 너무 바빠서 새 명령 프롬프트를 즉시 표시할 수 없거나, 중단된 프로그램이나 스크립트에 종료하기 전에 일부 작업(예: 저장되지 않은 데이터 백업)을 수행하거나 중단 신호를 무시하는 SIGINT 처리기가 있을 수 있습니다. 완전히.