답변:
터미널에서 키보드로 전송 된 Up 키의 원시 키 코드를 터미널이 나타내는 방식입니다. 기본적으로 쉘은 일반적으로 키 누르기를 차단하지만 로그인 프롬프트에서 수행 할 작업은 없습니다. 따라서 입력 한 문자는 다른 문자 (또는 숫자 등)와 같이 콘솔에 인쇄됩니다.
키보드는 컴퓨터로 이벤트를 보냅니다. 이벤트에 "스캔 코드 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의 메타 키란 무엇입니까?를 참조하십시오 .
키가 "터미널"(즉, 터미널 에뮬레이터 응용 프로그램)로 표시되는 방식에 관한 것이 아닙니다. 당신이보고있는 것은 한 줄 위로 이동하지만 인쇄 가능한 형태로 번역 된 ANSI 코드 ( ANSI 이스케이프 시퀀스 )입니다.
키보드 하드웨어는 "스캔 코드"를 보내지 만 명령 줄 수준의 응용 프로그램에 문자로 변환되어 표시됩니다. 키 A는 단일 바이트가 A
됩니다. Shift 키가 눌려진 경우 (또는 Shift Lock) a
그렇지 않은 경우입니다.
ANSI 호환 터미널에서 화살표 키는 단일 문자 (ASCII 문자 세트에 화살표 코드가 없음)를 보내지 않고 3 문자 "이스케이프 시퀀스"를 보냅니다 escape-[-A
. 다른 세 개의 화살표 키는 escape-[-B, C, D
입니다.
이전 문자 ANSI 터미널로 전송 (에코)되면 동일한 문자 순서로 커서가 한 줄씩 위로 이동합니다. 터미널 에뮬레이터를 포함한 많은 프로그램은 이러한 문자 시퀀스를 인식하고 적절한 작업을 수행합니다. 터미널 에뮬레이터는 커서를 위로 이동하지만 ( curses
라이브러리가 커서를 움직이는 방식 ), bash
대신 인터셉트하고 히스토리를 스크롤합니다.
커서를 화면 주위로 이동하는 데 사용하지 않는 프로그램에서 커서가 모든 곳에서 끝나는 것을 피하기 위해 키보드 입력의 ESC가 인쇄 가능한 순서로 표시되는 경우가 종종 있습니다 ^[
(이스케이프가에 해당하기 때문 control-[
). 이것은 실제로 터미널 장치 인터페이스에 의해 처리됩니다. 참조하십시오 stty(1)
. 결과적으로 위쪽 화살표가로 표시됩니다 ^[[A
. 을 입력 cat
하고 Return 키를 누른 다음 화살표 키를 누르면 명령 줄에서이를 볼 수 있습니다 . 이것은 콘솔 로그인 화면에서도 볼 수 있습니다.
마지막으로 : Control, Alt, 당신이 문자 순서에 매핑되지 않는 한 다른 키. 그것들은 다른 키 누르기 ( 위 의 a
/ A
예제와 같이)에 의해 보내지는 문자에 영향을 주거나 단순히 텍스트에 매핑되지 않습니다. 이러한 키 누르기는 키보드 이벤트를 수신하는 프로그램에서만 감지 할 수 있습니다. 표준 입력에서 읽거나 파일에 쓰면 볼 수 없습니다.
이 행동은 쉘마다 다릅니다. 대부분의 쉘 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
커서 업 ( Value
Empypy 가 가능한 곳 )
[ValueB
커서 아래로 ( Value
emtpy 일 수있는 곳 )
login
관련되어 있기 때문에 다른 것 bash
입니다.
bash
및 login
편집 라인에 동일한 라이브러리 (작성한 Readline을)를 사용하고 있습니다. 차이점은 login
수직 화살표 키를 명령처럼 해석 bash
하지 않는다는 것입니다.
^[
표현 처럼 escape
보이지만 서로 다릅니다. Bash는 모든 구문을 전혀 사용할 수 없었습니다. 실제로, \[A
bash 를 작성할 때 bash는 세 문자를 출력합니다 ^[
(예 : escape) [
,, A
.
이것들은 ANSI 이스케이프 코드 입니다. ^[
쉘이 ESC
바이트 (ASCII 바이트 27) 를 표시하기 위해 사용하는 표기법 입니다. 예를 들어 텍스트 뒤에 ESC 바이트가 [A
있습니다. Wikipedia 기사에서 볼 수 있듯이 ^[[
( ESC
다음에 오는 [
)은 제어 시퀀스 소개 자 또는 CSI입니다. CSI A
커서를 한 열 위로 이동한다는 의미입니다.
터미널에서 이스케이프 코드를 보려면 CTRL + V를 입력 한 다음 다른 키 시퀀스를 입력하십시오. 예를 들어, CTRL + V 다음에 위쪽 화살표가 표시 ^[[A
됩니다.
getty
또는login
에 의해 삼킬 수 있습니다 . 교육적인 추측에 따르면 인쇄 화면은 역사적인 이유로 커널에 의해 특별히 해석됩니다. 그러나 수정자를 제외하고는 100 % 확실하지 않습니다.