나는 이것을 가지고있다:
아래쪽 화살표 키를 읽었습니다.
abc@abc-ubuntu:~/bashpratice$ read -n 3 key
^[[Babc@abc-ubuntu:~/bashpratice$
나는 그것을 찾을 수 있었다
abc@abc-ubuntu:~/bashpratice$ echo $key | grep '\['
[B
abc@abc-ubuntu:~/bashpratice$ echo $key | grep '\[B'
[B
하지만 에코 키는 공백만 인쇄합니다.
abc@abc-ubuntu:~/bashpratice$ echo $key
abc@abc-ubuntu:~/bashpratice$
키 입력을 반향하면 공백만 제공되는 이유는 무엇입니까?
답변1
터미널에 downarrow를 입력하면 어떻게 되나요?
보고에 따르면 +를 입력 xxd -p
하면 다음과 같습니다 .↓return
xxd -p
^[[B
1b5b420a
아래쪽 화살표 키를 누르면 3개의 문자 시퀀스가 생성됩니다.
- 첫 번째는
\x1b
(일명 이스케이프됨, 참조man ascii
) 터미널에 다음과 같이 에코됩니다^[
. - 두 번째는
\x5b
, 즉[
, - 세 번째는
\x42
, 즉B
.
마지막 문자는 \x0a
개행 문자일 뿐입니다.
따라서 아래쪽 화살표는 터미널에 로 에코됩니다 ^[[B
. 사실상 이는 1b5b42
실제로 읽기 프로세스에 전송되는 16진수 시퀀스에 해당합니다.
실험 정보
변수 에 16진수 시퀀스가 key
포함되어 있습니다 . 1b5b42
확인하다
echo -n "$key" | xxd -p
1b5b42
물론 16진수 시퀀스(예: )를 grep
캡처하는 것도 가능합니다 .5b42
[B
그러나 터미널에 무언가를 보내면 이스케이프 문자는 \x1b
특수 이스케이프 시퀀스의 시작으로 해석됩니다. 예를 들어, \x1b[31m
대부분의 터미널에서 인식되는 시퀀스는 "빨간색 전경색 사용"을 의미합니다. 직접 확인해보세요:
echo -e 'hello \x1b[31myou'
이 시퀀스는 현재 색상을 변경하지만 아무것도 인쇄하지 않습니다. 다음 내용도 확인할 수 있습니다.
echo -e 'hello \x1b[Byou'
\x1b[B
터미널이 특수 시퀀스를 "커서를 한 위치 아래로 이동"으로 해석하는 것을 볼 수 있습니다 .
그렇기 때문에 echo $key
일부 빈 줄을 제외하고는 터미널에 직접적으로 아무것도 표시되지 않습니다.
— 1. 왜 인쇄되는지
잘 모르겠습니다 . 설정 결과가 일부 다릅니다.grep
[B
답변2
단말기가 키 코드에 응답하지 않습니다. 이는 일반적으로 애플리케이션에 의해 표시되고 해석됩니다. 해당 애플리케이션은 시퀀스를 보내 cup
거나(커서를 위로 올리거나) 내릴 수 있습니다(보통 ncurses 라이브러리 사용).