^ [[콘솔 로그인 화면에서 위쪽 화살표를 누르면 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
bash및 login편집 라인에 동일한 라이브러리 (작성한 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.