^ [[콘솔 로그인 화면에서 위쪽 화살표를 누르면 A가 표시되는 이유가 있습니까?


32

콘솔 로그인을 할 때마다 up화살표를 의도적으로 눌러 이전에 입력 한 명령을 볼 수 있습니다. 그러나 나는 이것을 본다 ^[[A.

그러나 Ctrl Alt Print Screen Scroll Lock Pause Break Page Up Page Down Win키를 누르면 문자가 에코되지 않습니다.

뒤에 이유가 무엇입니까?

합니까 ^[[A문자가 무엇을 의미 종류의?

여기에 이미지 설명을 입력하십시오

답변:


20

터미널에서 키보드로 전송 된 Up 키의 원시 키 코드를 터미널이 나타내는 방식입니다. 기본적으로 쉘은 일반적으로 키 누르기를 차단하지만 로그인 프롬프트에서 수행 할 작업은 없습니다. 따라서 입력 한 문자는 다른 문자 (또는 숫자 등)와 같이 콘솔에 인쇄됩니다.


3
@RubanSavvy Ctrl, Alt 및 Win (GNU / Linux 환경에서 Super라고도 함)은 수정 자입니다. 키와 키를 누르면 화면에 다른 인쇄 된 내용이 표시됩니다. 확실하지는 않지만 tty 제어를 위해 커널 또는 저수준의 것으로 스크롤 잠금이 의심됩니다. 이유는 확실하지 않지만 페이지 위아래로 getty또는 login에 의해 삼킬 수 있습니다 . 교육적인 추측에 따르면 인쇄 화면은 역사적인 이유로 커널에 의해 특별히 해석됩니다. 그러나 수정자를 제외하고는 100 % 확실하지 않습니다.
strugee December

3
위의 답변으로 편집해야합니다.
strugee December


19

키보드는 컴퓨터로 이벤트를 보냅니다. 이벤트에 "스캔 코드 nnn 다운"또는 "스캔 코드 nnn 업"이 표시됩니다. 체인의 다른 쪽 끝에서 터미널에서 실행되는 응용 프로그램은 일련의 문자 형식으로 입력을 예상합니다. (X 서버와 같이 원시 액세스를 요청하지 않은 경우) A키보드 를 누르면 "scan code 38 down"정보가 전송됩니다. 콘솔 드라이버는 키맵을 찾아이를 "문자 a" 로 변환합니다 (수정 자 키를 누르지 않은 경우).

문자가 아닌 키 또는 키 조합을 누르면 정보가 문자로 인코딩되어야합니다. 일부 키와 키 조합에는 해당 제어 문자가 있습니다 (예 : Ctrl+ A문자 전송 (바이트 값 1), Return문자 전송 (Ctrl + M, 바이트 값 13) 등) 대부분의 기능 키에는 해당 문자가 없으며 대신 전송 (이스케이프, 바이트 값 27) 문자로 시작하는 일련의 문자 예를 들어, 키 Up는 이스케이프 시퀀스 ␛[A(세 문자 : 이스케이프, 열린 괄호, 대문자 A)로 변환됩니다.

콘솔의 사용자 이름 프롬프트는 바보이며 대부분의 이스케이프 시퀀스를 이해하지 못합니다. 셸에서 제공하는 라인 에디션 및 히스토리 기능은 없습니다. 로그인 할 때까지는 쉘이 없습니다. 따라서 단순히 이스케이프 시퀀스를 표시합니다. 캐릭터의 글리프가 없으므로로 표시됩니다 ^[. ^기호는 전통적으로 제어 문자의 접두사로 사용되며, 탈출입니다 ^[때문에 바이트 값의 : 그것은 바이트의 값이다 [, 마이너스 64.

를 누르면 Up쉘 프롬프트에서이 쉘에 같은 3 문자 시퀀스를 전송합니다. 쉘은 이것을 명령 순서 (일반적으로 이전 이력 항목을 호출하기 위해)로 해석합니다. 를 누르면 Ctrl+ V다음 Up쉘 프롬프트에서이 삽입 프롬프트에서 이스케이프 시퀀스 : Ctrl+ V그렇게 명령으로 해석의 문자 대신에 다음 문자를 삽입하는 명령이며, 문자는 이스케이프 시퀀스의 시작으로 해석되지 않습니다 .

일부 키는 수정 자일 뿐이며 터미널 응용 프로그램으로 전송되지 않습니다. 예를 들어,을 누르면 Shift이 정보가 터미널 드라이버에 유지되고을 누르면 고려되어 A드라이버가 A대신 응용 프로그램으로 전송 됩니다 a.

또한 일부 기능 키가 콘솔에 매핑되지 않을 수 있습니다.

GUI의 유사한보기 는 bash의 메타 키란 무엇입니까?를 참조하십시오 .


Gilles에게 언제나 감사합니다.
JoshuaRLi

5

키가 "터미널"(즉, 터미널 에뮬레이터 응용 프로그램)로 표시되는 방식에 관한 것이 아닙니다. 당신이보고있는 것은 한 줄 위로 이동하지만 인쇄 가능한 형태로 번역 된 ANSI 코드 ( ANSI 이스케이프 시퀀스 )입니다.

  1. 키보드 하드웨어는 "스캔 코드"를 보내지 만 명령 줄 수준의 응용 프로그램에 문자로 변환되어 표시됩니다. 키 A는 단일 바이트가 A됩니다. Shift 키가 눌려진 경우 (또는 Shift Lock) a그렇지 않은 경우입니다.

  2. ANSI 호환 터미널에서 화살표 키는 단일 문자 (ASCII 문자 세트에 화살표 코드가 없음)를 보내지 않고 3 문자 "이스케이프 시퀀스"를 보냅니다 escape-[-A. 다른 세 개의 화살표 키는 escape-[-B, C, D입니다.

  3. 이전 문자 ANSI 터미널로 전송 (에코)되면 동일한 문자 순서로 커서가 한 줄씩 위로 이동합니다. 터미널 에뮬레이터를 포함한 많은 프로그램은 이러한 문자 시퀀스를 인식하고 적절한 작업을 수행합니다. 터미널 에뮬레이터는 커서를 위로 이동하지만 ( curses라이브러리가 커서를 움직이는 방식 ), bash대신 인터셉트하고 히스토리를 스크롤합니다.

  4. 커서를 화면 주위로 이동하는 데 사용하지 않는 프로그램에서 커서가 모든 곳에서 끝나는 것을 피하기 위해 키보드 입력의 ESC가 인쇄 가능한 순서로 표시되는 경우가 종종 있습니다 ^[(이스케이프가에 해당하기 때문 control-[). 이것은 실제로 터미널 장치 인터페이스에 의해 처리됩니다. 참조하십시오 stty(1). 결과적으로 위쪽 화살표가로 표시됩니다 ^[[A. 을 입력 cat하고 Return 키를 누른 다음 화살표 키를 누르면 명령 줄에서이를 볼 수 있습니다 . 이것은 콘솔 로그인 화면에서도 볼 수 있습니다.

마지막으로 : Control, Alt, 당신이 문자 순서에 매핑되지 않는 한 다른 키. 그것들은 다른 키 누르기 ( 위 의 a/ A예제와 같이)에 의해 보내지는 문자에 영향을 주거나 단순히 텍스트에 매핑되지 않습니다. 이러한 키 누르기는 키보드 이벤트를 수신하는 프로그램에서만 감지 할 수 있습니다. 표준 입력에서 읽거나 파일에 쓰면 볼 수 없습니다.


3

이 행동은 쉘마다 다릅니다. 대부분의 쉘 readline은 프롬프트에서 행을 편집하기 위해 호출 된 라이브러리를 사용 합니다. 다음 은이 라이브러리에 대한 완전한 명령 참조입니다. 따라서 응용 프로그램을 사용할 readline때이 명령으로 행을 편집하고 탐색 할 수 있습니다.

수직 화살표 키는 명령 내역을 탐색하기 위해 읽기 라인으로 구성됩니다. 그리고 로그인 프롬 트에는 명령 히스토리가 없습니다. 문자 ^[[A^[[B화면에 인쇄되는 이유 입니다. 그래서 무엇을 ^[[A의미합니까?

bash 매뉴얼 페이지는 PROMPTING다음과 같습니다.

\[     begin a sequence of non-printing characters, which could be used to embed
       a terminal control sequence into the prompt

ANSI에서 화살표 키 의 이스케이프 시퀀스 는 다음과 같습니다.

  • [ValueA커서 업 ( ValueEmpypy 가 가능한 곳 )

  • [ValueB커서 아래로 ( Valueemtpy 일 수있는 곳 )


5
귀하의 답변은 로그인 프롬프트가에 의해 처리되고 login관련되어 있기 때문에 다른 것 bash입니다.
Risto Salminen

1
bashlogin편집 라인에 동일한 라이브러리 (작성한 Readline을)를 사용하고 있습니다. 차이점은 login수직 화살표 키를 명령처럼 해석 bash하지 않는다는 것입니다.
혼돈

네, 인정합니다.
Risto Salminen

bash 구문은의 ^[표현 처럼 escape보이지만 서로 다릅니다. Bash는 모든 구문을 전혀 사용할 수 없었습니다. 실제로, \[Abash 를 작성할 때 bash는 세 문자를 출력합니다 ^[(예 : escape) [,, A.
Alexis

0

이것들은 ANSI 이스케이프 코드 입니다. ^[쉘이 ESC바이트 (ASCII 바이트 27) 를 표시하기 위해 사용하는 표기법 입니다. 예를 들어 텍스트 뒤에 ESC 바이트가 [A있습니다. Wikipedia 기사에서 볼 수 있듯이 ^[[( ESC다음에 오는 [)은 제어 시퀀스 소개 자 또는 CSI입니다. CSI A커서를 한 열 위로 이동한다는 의미입니다.

터미널에서 이스케이프 코드를 보려면 CTRL + V를 입력 한 다음 다른 키 시퀀스를 입력하십시오. 예를 들어, CTRL + V 다음에 위쪽 화살표가 표시 ^[[A됩니다.


0

Bash와 같은 명령 셸은 화살표를 "이전 명령 검색"작업으로 변환하는 프로그램입니다. 명령 셸이 실행되고 있지 않습니다.


0

TLDR

sh위쪽 화살표 키를 눌렀을 때 생성 된 원시 키 코드를 출력하는 실행 중일 수 있습니다.

이와 같은 고급 쉘은 bash이러한 키 코드를 가로 채고 그와 함께 무언가를 수행합니다. 예를 들어, 역사에서 마지막 명령을 보여줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.