내 프로그램이 사용자 입력을 읽을 때 세로 화살표 키는 아무 작업도 수행하지 않습니다. 줄 규칙이 모든 것을 콘솔에 다시 반영하면 커서가 터미널의 이전 줄 위로 이동하지 않습니까? 내 말이 맞다면 선 규칙이 응답하지 않는 다른 문자가 있습니까?
그런데, bash가 사용하는 것 같아요"오리지널 모드"(이것은 에코 등을 비활성화합니다.) 그러나 실행하면 stty -echo
터미널이 "정지"되어 일반 bash 실행 중에 에코가 활성화되었음을 나타냅니다.
Zsh는 이러한 동작을 나타내지 않지만 그 때문인 것 같습니다.에코 플래그 재설정명령이 종료될 때.
답변1
"내 프로그램"이 무엇을 의미하는지, 프로그램이 터미널 라인의 설정을 어떻게 변경하는지 알지 못하면 대답하기 어렵습니다.
텍스트 편집기일 수 있으며 파일에서 커서를 이동할 수 있습니다. 다른 셸일 수도 있고 기록 항목을 스크롤할 수도 있습니다. 볼륨을 높이거나 낮추는 오디오 제어 소프트웨어일 수 있습니다. 등.
와 같은 경우 줄 규칙이 원래 형식으로 다시 에코하지 않고 바이트를 사람이 읽을 수 있는 텍스트 와 문자 로 변환하기 때문에 sleep 1000
표시되고 ^[[A
나타 납니다.^[[B
ESC
^
[
cat
이면 을 클릭하면 커서 Enter가 수직으로 움직이는 것을 볼 수 있습니다. 지연 이유는 라인 제자가 애플리케이션에 문자 전송을 지연하기 때문입니다(즉, cat
전체 입력 라인이 완료될 때까지). 커서가 수직으로 움직이는 이유는 라인 규칙과 관련이 없으며 단지 cat
원시 데이터가 에코되기 때문이며 화살표 키에 의해 생성된 입력 이스케이프 시퀀스가 라인에서 커서를 이동하기 위한 출력 이스케이프 시퀀스와 동일하기 때문입니다. 방향을 말해보세요.
답변2
TUI 애플리케이션 또는 보다 일반적으로 키보드 입력 자체를 처리하는 애플리케이션가지다키를 눌렀을 때 전송된 문자를 읽고 자체 작업을 수행해야 하므로 라인 규칙의 자체 라인 편집기( ICANON
) 및 로컬 에코( )를 비활성화합니다 .ECHO
echo
이러한 응용 프로그램은 시작될 때 termios 설정을 변경하고 종료(또는 일시 중지)되면 복원합니다.
readline(bash에서 사용하는 줄 편집기)과 zle(zsh 줄 편집기)도 예외는 아닙니다.
이 라인 편집기는여기 간다쉘이 프롬프트를 발행하고중지됨명령을 실행할 때.
따라서 다른 명령을 실행하면 stty -a
readline /zle에 사용된 termios 설정이 표시되지 않고 떠날 때 복원된 설정이 표시됩니다.
활성화 되면 ECHO
터미널의 입력이 에코되지만 제어 문자와 관련하여 고려해야 할 두 가지 다른 사항이 있습니다. 세 번째는 화살표 키와 관련된 것입니다.
ICANON
기본적으로 켜져 있으면 라인 규칙 내부 라인 편집기는 자체 라인 편집을 위해 BS 또는 DEL과 같은 일부 제어 문자를 가로 챕^W
니다^U
. ESC(화살표 키로 전송되는 첫 번째 문자는 일반적으로 이러한 문자가 아닙니다).- 이 기능도 켜져 있으면 (일반적으로 기본적으로 설정되어 있음) 제어 문자는 있는 그대로가 아니라 있는 그대로
ECHOCTL
에코됩니다 .^X
- 터미널은 일반적으로 "키보드 전송" 모드에 있든 없든 다른 이스케이프 시퀀스를 보낼 수 있습니다.
tput smkx
, 이후에 Up키 누르기가 를 보내고\eOA
, 이후에 커서를 위로 이동하는 시퀀스(전송된 것과 동일한 시퀀스 ) 에 정확히 해당하는 시퀀스를tput rmkx
보낸다는 것을 알 수 있습니다 . 일부 터미널은 키를 눌렀을 때 전송되는 내용에 영향을 미치는 다른 모드도 지원합니다. 여기서는 이에 대해 논의하지 않습니다.\e[A
tput cuu1
따라서 화살표 키를 누를 때 터미널 규칙 Local Echo가 커서를 이동하도록 하려면 다음을 수행해야 합니다.
tput rmkx; stty -icanon echo -echoctl; cat > /dev/null