강좌
클라우드/리눅스에 관한 강좌입니다.
리눅스 분류

리눅스 콘솔에서 사용하는 핫 키 만들기

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

icon01.giftitle79.gif


번역: 윤봉환 / el@linuxlab.co.kr
By Bryan Henderson

 

들어가며

나는 커맨드 라인 사나이이다. 물론 나도 요즘 리눅스 시스템에 대해 모르는 건 아니어서, 윈도 사용자처럼 무식한 척하고 마우스로 클릭 클릭만 할 수도 있다. 그러나 나는 리눅스 콘솔에서 내 배시 프롬프트를(Bash prompt) 보고 있을 때가 제일 편안하다. X를(월드 와이드 웹 곳곳에 그래픽 웹브라우저가 아니면 들여다 볼 수 없는 곳이 허다하니 할 수 없었다) 설치하기 전까지 두 해 동안 나는 행복하게 리눅스를 사용해 왔다. 지금도 내 마우스는 주로 바닥에서 놀고 있다.

그렇다고는 해도 명령들을 써넣는 일은 정말 따분하다: 예를 들어 하루에도 스무번씩 내 메일박스를 들여다보는 것처럼. 신경쓰느라 만든 두 글자짜리 유닉스 명령들, 에일리어스들, 그리고 명령행 완성(word completion) 기능만으로는 귀찮은 키 스트로크에서 벗어나기에 한참 멀었다. 그래서 나는 그저 F2 키를 한 번 누르기만 하면 내 메일 박스에서 메일을 가져오도록 설정하기로 마음 먹었다. F1은? 내가 하루에 몇 번씩 들여다보는 레퍼런스 파일을 연다. 그밖에 다른 키들은 내가 자주 사용하는 옵션 문자열들, 파일이름들, 그리고 디렉토리 이름들을 넣는다.

어떤 명령, 혹은 명령의 일부도 키보드에 있는 아무 키에나 넣을 수 있다. F 키들은 물론이고 Alt와 Control, Shift, 'NumLock' 램프가 켜진 뉴메릭 키패드까지 마음대로 선택할 수 있다.

뭐 별로 어려운 내용은 없지만, 읽긴 읽었어도 이런 일들을 어떻게 해야 할지 모른다면; 조금 더 도움이 될까 하여 키보드 기능에 대한 배경 지식을 알려 주려고 한다.

 

배경 - 어떻게 키 스트로크가 명령이 되지

나는 IBM (ISA) 스타일의 컴퓨터에 연결된 IBM 표준 키보드에서만 작업했는데, 여러분의 키보드에서는 적용할 수 없는 것들이 몇 가지 있을지도 모르겠다. 하지만, 어떤 리눅스 키보드에서도 기본적인 테크닉은 제대로 동작하리라 믿는다.

Bash는 모든 명령들을(이 글에서 "명령"이란, 명령 프롬프트에 대해 여러분이 응답하는 것을 의미한다) GNU Readline 라이브러리를 통해 받아들인다. Readline은 어떤 프로그램에서 키보드로부터 입력을 받아들여야 할 때 사용하는 서브루틴 라이브러리이다. 프로그램에서 터미널의 정규 파일 read 대신 Readline은 사용하여 얻게 되는 장점은 Readline 코드가 사용자가 마음 먹은 대로 라인을 편집할 수 있고, Readline이 프로그램에 여러분의 명령을 전달하기 전에 여러분이 원하는 방법대로 라인을 구성할 수 있는 다양한 마술을 부린다는 것이다. 백스페이스, 문자열 지우기, 히스토리 소환, 삽입 등 Bash 프롬프트 위에서 여러분이 할 수 있는 명령라인 편집의 마술이 모두 Bash 자체적으로 해내는 것은 아니지만, 어쨌든 Bash가 불러온 Readline을 서브루틴이다.

Bash는(역시 GNU의 걸작이다) Readline의 가장 큰 고객이고, 화려한 라인 편집 기능을 가져다가 제대로 활용하여 명성을 날린다(대략 60여개나 있다). 실제로 이런 것들은 Bash 맨 페이지에 설명되어 있었다.(뭐 그리고 수백만의 사용자들이 amazon.com이란 사이트가 AOL의 일부라고 생각한들 또 어떤가) Bash에서 작업이 모두 Readline 라이브러리의 콜 루틴(call routines)이며, 다른 많은 프로그램들도 같은 루틴을 호출하고, 같은 라인 편집 기능을 가지고 있다. 예를 들어 Gdb와 Postgresql의 SQL 프롬프트 (Psql), 그리고 FTP 클라이언트 몇 가지가 그렇다.

Readline은 터미널로부터 문자들의 스트림을 가져온 다음 (그럼 오래된 터미널에서도 가능할까? Readline의 유연성은 리눅스 가상콘솔에만 제한되지는 않는다) 일정한 시퀀스에 따라 인식하고 파악된 문자에 따라 지정된 기능을 실행한다. 예를 들어, E를 확인했다면 Readline은 여러분이 구성한 라인에 E를 집어 넣는다. Readline이 Control-A를 확인했다면, 커서를 줄의 맨 처음으로 돌려 보낸다. Tab을 만났다면 여러분의 마음을 읽을 것이다 (누가 뭐라 하든 적어도 내게는 마음을 읽는 것으로 보인다)

어떤 문자 시퀀스를 만났을 때 Readline이 어떻게 동작할 것인지는, 일반적으로 여러분의 홈 디렉토리 아래 .inputrc라는 이름의 파일로 존재하는 Readline 설정 파일을 이용해서 선택하도록 설정할 수 있다.

 

핫키 만들기

우리가 이용하려는 Readline 함수는 구성 중인 라인에 문자열을 삽입하는 것이다. 첫 번째 예제를 쉽게 만들기 위해 우스꽝스런 짓을 좀 해야 한다: ps -a --forest 라는 문자열을 문자 z에 연결한다. 이렇게 한 번 해두면, 우리는 z가 들어 있는 명령은 죄다 사용할 수 없게 된다.
흐, 정말 터무니없는 짓이다.

z에 명령을 연결하기 위해 ~/.inputrc 파일에 아래 라인을 덧붙인다 (만약 .inputrc라는 이름을 가진 파일이 여러분의 홈 디렉토리에 없다면 아래 줄을 넣어서 새로 만든다)

"z":"ps -a --forest"

이렇게 변경한 내용을 여러분의 콘솔에 적용하는 가장 간편한 방법은 로그아웃한 다음에 다시 로그인하는 것이다.

위에서처럼 설정한 다음에, z 키를 누르면 ps -a --forest라는 문자들이 여러분의 명령 라인 버퍼에 나타날 것이다(그러니까 명령 프롬프트 뒤에) 그 다음 엔터를 누르면 ps 명령이 실행된다. 그리고, 여러분은 z로 시작하는 명령 라인을 가질 수 없다는 것을 발견할 것이다. 예를 들어 echo z 명령을 실행하려 할 때, z를 쓰는 순간 명령 라인에는 echo ps -a --forest라는 문자열들이 나타날 것이다.

그러나, 보다 그렇듯 하게 만들려면 ps 명령을 F1 키에 연결하는 게 좋겠다. z 키와는 다르게, F1 키를 눌러 Readline으로 전송하는 문자가 타이프할 수 있는 단순한 문자가 아니라서 이 작업은 좀더 어려웠다. 대신에 F1은 터미널 형태에 독립적인 문자 시퀀스를 보낸다. 우리는 단지 리눅스 콘솔에만 관심이 있으며 기본 리눅스 콘솔 환경 하나에서 사용한다. 이런 경우 F1은 이스케이프(Escape), [, [, 그리고 A, 등 문자 네 개를 전송한다.

그렇지만 F1을 눌러도 위에서 말한 문자 네 개가 나타나지는 않을 것이다. Raedline의 인용-삽입(quoted-insert) 기능을 이용해서 테스트할 수 있다. 인용-삽입은 키가 가지고 있는 기능을 실행하지 않고 캐릭터 값을 명령라인에 넣는다. Readline이 키 스트로크를 이스케이프 문자로 해석하지 못하게 할 때 필요하다. 이 기능을 이용해서 여러분이 F1이 전달하는 값을 알아보려면 Bash 프롬프트에서 Control-V를 누른 다음 F1 키를 누르면 된다. Readline은 이스케이프를 표시하고 이어서 문자 세 개를 입력라인에 출력하고 원래 출력될 값을 이어서 보여준다. 이스케이프 문자는 아마 Control-[를 뜻하는 ^[일 것이다(Escape의 다른 이름이다) 이 트릭은 여러분의 키보드에 있는 키가 원래 가지진 정확한 시퀀스를 발생시키는 가장 쉬운 방법이다.

F1이 이스케이프-[-[-A 시퀀스를 전송한다는 것을 기억하고, ~/.inputrc 파일에 적절한 설정값을 넣어야 한다. 이스케이프 문자를 파일에 넣을 때에 에디터에서 자체적으로 지원하지는 않는다. 그러므로 설정 파일에 있는 \e 문자열을 이스케이프 문자로 받아들이도록 Readline이 여러분을 도와야 한다. 이제 위에서 ~/.inputrc 파일에 설정했던 z 키를 지우고 아래처럼 고쳐 넣는다:

"\e[[A":"ps -a --forest"

로그아웃하고 다시 로그인하는 대신 좀더 세련된 방법을 사용하려 한다면 Control-X Control-R 키를 누른다. 그러면 여러분의 Readline 설정파일을 다시 불러올 것이다. 이제는 F1 키를 누르면 ps -a --forest가 나타날 것이다.

그렇지만, F1 다음에 엔터를 누르면 지금까지 설정한 것들이 의미를 잃고 만다. 마치 리모콘을 TV에 닿을 만큼 가까이 가져간 다음 채널버튼을 누르는 것과 같다.

콜론 다음에 써넣은 것들은 매크로로 호출된다. (따옴표로 둘러싸여 있지 않다면 라인의 끝과 같은 기능일 것이다) Readline은 명령 행의 문자열에서 특정한 문자를 만났을 때 마치 여러분이 써넣은 것처럼 연결된 다른 문자열을 넣는다. 위에서처럼 할지라도 이제까지는 단지 라인 버퍼에 문자들을 삽입하도록 정의되었을 뿐이다(p, s, 등) 우리는 보다 낭만적인 일에 연결한 문자들을 사용할 수 있다. 그런 문자 가운데 하나가 캐리지 리턴(Carriage Return)키이다 (여러분은 타자기를 기억하는가?) 엔터키를 눌렀을 때 여러분의 터미널 전송하는. 캐리지 리턴은 Control-M과 같으므로 여러분은 캐리지 리턴을 Readline의 특별한 기호법인 "\C-M"으로 바꾸어서 줄 쉬에 넣어야 한다. 이제 아래 줄을 여러분의 ~/.inputrc 파일에 넣고 설정파일을 다시 읽어오면 여러분은 원-터치 ps 명령을 보게 될 것이다.

"\e[[A":"ps -a --forest\C-M"

이게 실제로 필요한 전부이다. 원하는 어떤 명령이든지, 그리고 여러분이 원하는 키가 무엇이든지 마음대로 조합할 수 있다. 여러분의 F키와 뉴메릭 키패드 시퀀스 연결을 알아내기 위해 인용-삽입 테크닉을 사용한다. 이 때 뉴메릭 키패드는 모드에 주의한다. 뉴메릭 키패드는 토글상태에 따라 전혀 다른 시퀀스를 전송한다.

Alt, Control과 조합되는 키를 위해 C-x와 M-x를 ~/.inputrc 파일 안에서 사용한다 ( M은 Meta의 약자로 Alt 키를 나타낸다)

여러분의 시스템에서 Info 문서에 링크되어 있는 "Readline User's Guide"를 보면 많은 도움이 될 것이다. Readline 서브루틴의 맨 페이지도 역시 도움이 된다.

info readline
man readline

00-9-3.gif 

 

譯註: Info 사용법
Info는 하이퍼텍스트 형태로 Info 문서나 맨 페이지를 살펴보는 도구이다. Info 안에서는 Node를 통해 문서를 옮겨 다니는데, 노드는 웹에서 하이퍼링크와 비슷하다.

위 그림에서 현재 노드는 Command Line Editing이고 다음 주제는 Programming with GNU R\이다. 'n' 키를 누르거나 '>' 키를 누르면 다음 노드로 이동한다.(엔터는 누르지 않는다) 'p'나 '<' 명령은 이전 노드로 이동한다.

* Menu : 라인 아래에 '*' 문자로 시작하는 것들은 메뉴이다. 메뉴는 1, 2, 3 등
  숫자를 이용해서 선택할 수 있는데, 예를 들어 위 그림에서
  '1'은 * Introduction and Notation:: Notation used in this text.,
  '2'는 * Readline Interaction:: The minimum set of commands for editing
  a line. 이다.

지정한 주제의 첫 페이지로 갈 때에는 't' 명령을 사용한다. 그리고 브라우저를 끝낼 때에는 'q' 키를 누른다.

's' 키를 누르면 화면 아래 쪽에 Search for string []: 이라는 프롬프트가 나타난다. 프롬프트에 이어 검색하려는 문자열을 쓰면 본문 가운데 일치하는 문자열을 찾아준다.

'PqDn', 'PgUp'을 이용해 화면을 스크롤하며 스페이스바를 누르면 한 페이지 아래로 이동한다.


 

제대로 동작하지 않는다면

이제 키스트로크가 Readline 이전 레블의 인터럽트 때문에 여러분이 기대한 것처럼 동작하지 않는 등 몇 가지 문제상황에 대해 이야기하려 한다.

우선, tty 디바이스 드라이버가 (현재 키보드 디바이스 드라이버보다 앞선 수준의 드라이버이다) stty 프로그램에 의해서 제어되는 특수 문자 몇 개를 장악한다. Readline은 대부분의 tty 인터페이스를 끄지만, Control-S, Control-Q, Control-C, Control-Z 등 키 스트로크는 결코 가로챌 수 없을 것이다. tty 드라이버가 가로채어서 원래 정해진 대로 동작하게 한다.

다음은 키보드 드라이버이다. 키보드 드라이버는 여러분 마음대로 모든 키를 다룰 수 있도록 환경을 제공하는데 Readline과 같은 수준은 아니다. 여러분 정신이 조금 이상해져서 왼쪽 Shift 키를 누르면 q 문자가 나타나도록 설정하고 싶다면 키보드 드라이버가 가능하게 해준다. 더 중요한 것은 키보드 드라이버가 지정한 콘솔 기능과 일정한 키스트로크를 연결한다. 그런 키스트로크가 tty 드라이버로 보낸 다음 Readline으로 보내는 어떤 것도 발생하지 않는다
예를 들어 드라이버는 일반적으로 Alt-F1 키를 눌렀을 때 "첫 번째 가상 콘솔로 전환"하도록 설정되어 있는데, 여러분이 Alt-F1을 눌렀을 때 Napster 해적판 음악 디렉토리를 삽입하도록 Readline을 설정하려 한다면, 허용하지 않을 것이다.

X 아래에서 (말하자면 hanterm 창 같은) X 서버 서브루틴이 자체적으로 드라이버를 가지므로 리눅스 키보드 디바이스 드라이버는 대체로 무시된다. 그래서 키들이 반드시 일반적인 리눅스 가상콘솔에서 여러분이 본 Readline와 같은 문자 스트림을 발생시키지는 않는다.

 

더 많은 정보

여러분이 키보드 매핑에 대한 더 너른 세상에 흥미가 있다면, Keyboard-And-Console HOWTO(http://www.linuxdoc.org/HOWTO/Keyboard-and-Console-HOWTO.html)와 Readline 사용자 가이드, X에 관한 문서들을 읽어본다.

--------------------------------------------------------------
Copyright ⓒ 2000, Bryan Henderson
Published in Issue 55 of Linux Gazette, July 2000
--------------------------------------------------------------

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,042 명
  • 현재 강좌수 :  35,846 개
  • 현재 접속자 :  110 명