본문 바로가기

BashShell Programming

2장 Command-Line Editing

2. Command-Line Editing

컴퓨터 키보드로 타자를 항상 실수가 생기는 것이 가능하지만 유닉스 사용시에는 아마도 더욱 그럴 것이다.

유닉스 구문은 강력하지만 간결하지 않고, 이상한 문자로 가득 있고, 특별히 연상적이지도 않고 명령 행을 작성하는 것은 수수께끼 같이 복잡하다. 쉘과 C 쉘은 명령행 편집 방법을 매우 제한적으로 제공하여 같은 상황을 악화 시킨다.

특히 약간의 실수를 고칠 있도록 이전 명령행을 다시 불러올 있는 방법이 없었다. 사용자라면 명령행을 다시 입력해야 하는 불만을 확실히 것이다. BACKSPACE 사용할 있지만 RETURN 누르면 모든 것은 영원히 사라져 버린다.

 C쉘은 히스토리 기능을 제공하여 약간 호전 시켰다. 이전 명령행을 편집하는 방법을 조금 불편하지만 제공했다. 그러나 “유닉스 명령행을 편집기에서 편집하는 방법과 같이 편집할 없지?”라고 궁금해하는 사람들이 적잖이 있었다. 배시는 가장 일반적인 유닉스 편집기인 vi emacs 유사한 명령으로 명령행을 편집할 있도록 허용하는 편집 모드이다.

1.1 Enabling Command-Line Editing

배시 기본 편집모드는 이맥스 모드이다. (-noediting 옵션과 함께 배시를 시작하지 않는다면)

편집모드를 입력하는 2가지 방법이 있다.

1) set 명령어를 사용

$ set –o emacs  or
$ set –o vi

2) .inputrc 파일에서 readline 변수를 설정하여 편집모드를 선택( 챕터 뒤에서 것이다)

vi 모드와 이맥스 모드에서 책의 기본 명령어를 모방하는 것은 좋으나 고급 기능에 대해선 그렇지 않다. 주된 목적은 편집기를 사용하던 “키보드 조작 습관”을 쉘로 이어주는 것이다. fc C 히스토리를 대신하는 것으로 아주 강력한 도구이다. vi 이맥스 아닌 다른 편집기를 사용하는 사용자들에게 “비상구”가 있다.

1.2 The History List

모든 배시 명령어 히스토리 기능은 사용자가 쉘에 입력한 명령을 기록하는 목록에 의존한다. 사용자가 로그인하거나 다른 대화식 쉘에서 시작할 때마다 홈디렉토리에 .bash_history 파일의 초기 히스토리 목록을 읽는다. 시점부터 모든 배시의 대화식 세션은 자체 명령어 목록을 유지한다. 사용자가 쉘을 종료할 .bash_history 목록이 저장된다. HISTFILE 환경 변수를 설정하면 파일을 호출할 있다.

 

1.3 emacs Editing Mode

이맥스 사용자라면 한 줄짜리 창으로 된 심플한 이맥스 편집 모드를 유용하다고 생각할 것이다. 모든 기본 명령은 커서 이동, 잘라내기와 붙여넣기, 그리고 검색을 사용할 수 있다.

1.3.1 Basic Commands

이맥스 모드는 가장 기본 편집 기능 컨트롤 키를 사용한다. 이맥스에 익숙하지 않다면 유닉스 터미널에서 제공하는 가장 기본적인 “삭제” 키의 확장으로 (보통 사용하는 BACKSPACE DEL) 생각할 수 있다.

▒ 기본적인 이맥스 모드 명령

Command

Description

CTRL-B

한 문자 뒤로(왼쪽) 커서 이동(삭제 안함)

CTRL-F

한 문자 앞으로(오른쪽) 커서 이동

DEL

한 문자 뒤(왼쪽) 삭제

CTRL-D

한 문자 앞(오른쪽) 삭제

 

CTRL-B CTRL-F는 커서를 앞뒤로 움직일 때 사용한 하는 것이다. 화살표 키를 사용하여 왼쪽, 오른쪽으로 이동할 수 있으나 우리는 컨트롤 키만을 사용할 것이다. 예를 들어, 명령행에 입력하고 RETURN 대신에 CTRL-B를 계속해서 누르면 커서는 명령행의 맨 왼쪽 글자에 있을 것이다.

$ fgrep -l Duchess < ~cam/book/alice_in_wonderland

DEL을 누르면 점의 왼쪽에 아무 문자도 없기 때문에 아무 일도 일어나지 않는다. 그러나, CTRL-D를 누르면 첫 번째 문자(f)가 삭제될 것이다.

$ grep -l Duchess < ~cam/book/alice_in_wonderland

CTRL-F를 계속 누르면 다음과 같이 된다.

$ grep -l Duchess < ~cam/book/alice_in_wonderland!

이 시점에서 CTRL-D를 누르면 아무 일도 일어나지 않지 않지만 DEL을 누르면 마지막 d 문자가 삭제된다.

$ grep -l Duchess < ~cam/book/alice_in_wonderlan!

 

1.3.2 Word Commands

명령행을 처리할 때 기본 명령만으로도 할 수 있지만, 좀 더 고급스러운 명령을 사용하면 키보드 누르는 횟수를 좀더 줄일 수 있다. 이 명령은 한 문자가 아니라 words 단위로 처리한다. 이맥스 모드에서는 워드를 하나 이상의 영숫자의 배열로 정의한다. 기본 명령은 모두 문자 하나의 키보드를 눌렀지만 워드 명령은 ESC와 문자 하나를 사용하는 키 동작을 두 번 해야한다.

▒ 이맥스 모드의 워드 명령

Command

Description

ESC-B

한 워드 뒤로(왼쪽) 커서 이동

ESC-F

한 워드 앞으로(오른쪽) 커서 이동

ESC-DEL

뒤의(왼쪽) 한 워드 없앰

ESC-CTRL-H

뒤의(왼쪽) 한 워드 없앰

ESC-D

앞의(오른쪽) 한 워드 없앰

CTRL-Y

마지막에 삭제한 항목 되살리기

 

ESC-B를 누르면 한 워드 뒤로 커서가 이동한다. 밑줄 문자는 영숫자가 아니므로 이맥스 모드는 여기에서 멈춘다.

$ grep -l Duchess < ~cam/book/alice_in_wonderland

커서는 wonderlan w에 있고, 점은 밀줄(_) w 사이에 있다. 이제 -l 옵션의 Duchess Cheshire 로 바꿔보자. 명령어에서 뒤로 이동해야 하므로 ESC-B 4번 입력한다. 다음과 같이 된다.

$ grep -l Duchess < ~cam/book/alice_in_wonderland

ESC-B를 다시 누르면 Duchess의 시작에 위치하게 된다.

왜 이럴까? 워드란 영숫자만으로만 정의되었다고 한 것을 기억 하는가. 그래서 < 는 워드가 아니기 때문에 왼쪽 방향으로 다음 워드는 Duchess 이다.

$ grep -l Duchess < ~cam/book/alice_in_wonderland

이제 ESC-D를 누르면 Duchess 를 삭제할 수 있다.

$ grep -l !< ~cam/book/alice_in_wonderland

이제 원하는 값을 입력하면 된다.

$ grep -l Cheshire!< ~cam/book/alice_in_wonderland

Duchess 를 되돌리려면 CTRL-Y를 입력한다. CTRL-Y는 마지막으로 삭제한 워드를 되살린다. 이 경우에 점의 위치에 Duchess 다시 집어 넣는다.

$ grep -l CheshireDuchess!< ~cam/book/alice_in_wonderland

 

1.3.3 Line Commands

이맥스 모드에서는 보다 더 효율적으로 명령행을 이동할 수 있는 방법이 있다. 명령행 전체를 다룬다. CTRL-A, CTRL-E CTRL-K는 쉽게 이용할 수 있다. CTRL-Y를 이용하여 마지막 삭제된 것을 되살린다는 것을 기억하자.

이맥스 모드 명령

Command

Description

CTRL-A

명령행 처음(왼쪽)으로 커서 이동

CTRL-E

명령행 마지막(오른쪽)으로 커서 이동

CTRL-K

오른쪽에서 명령어 끝까지 없앰

1.3.4 Moving Around in the History List

지금까지 명령행 어디든 효율적으로 이동하거나 변경할 수 있는 것을 알게 되었다. 그러나 히스토리 리스트에 접근하여 이전 명령어를 다시 불러 올 수 있는 주제는 다루지 않았다.

▒ 이맥스 모드 히스토리 리스트를 통해 이동하는 명령

Command

Description

CTRL-P

이전 명령행으로 이동

CTRL-N

다음 명령행으로 이동

CTRL-R

뒤로 검색

ESC-<

히스토리 리스트의 첫 행으로 이동

ESC->

히스토리 리스트의 마지막 행으로 이동

 

CTRL-P CTRL-N은 히스토리 명령을 통해 이동한다. 이 명령어 대신하여 화살표 키를 사용할 수 있다. CTRL-P는 위화살표() 키와 같고 CTRL-P는 아래화살표()키와 같다.

명령어 입력 후에 RETURN을 누르면 두 가지 일이 발생한다.

첫 번째는 명령이 실행될 것이다. 두 번째는 이 명령행이 히스토리 리스트의 마지막에 들어가게 된다. CTRL-P, CTRL-N 그리고 CTRL-R은 명령어 히스토리에서 가장 자주 다루는 명령이다.

1.3.5 Textual Completion

이맥스 모드 기능 중 가장 강력하다고 할 수 있는 본문 완성 기능이다. 본문 완성 기능의 전제는 간단하다. 많은 파일명, 유저명 등의 입력을 분명하게 구별할 수 있다는 것이다.

이맥스 모드에서 본문 완성과 관련된 3가지 명령이 있다. 가장 중요한 것은 TAB이다. 텍스트의 일부를 입력하고 TAB을 누르면 완성하려고 시도한다. 그리고는 다음 4가지 중 하나가 일어난다.

1. 입력한 단어로 시작하는 전체 이름이 아무것도 없을 때에 쉘은 삑 소리가 나고 더 이상 아무것도 일어나지 않는다.

2. 명령 구문이 검색 경로에 있거나, 함수명, 파일명과 딱 맞는 명령이 있을 때 나머지 부분이 완성된다. 완성된 명령어 뒤에 공백이 하나 붙어 인자를 입력할 수 있게 된다. 본문 완성 기능은 명령 위치에 있을 때만 적용된다.

3. 입력한 구문과 일치하는 디렉토리가 있을 경우 파일명을 완성하고 슬래시(/)가 붙는다.

4. 입력한 구문과 일치하는 경우가 두 가지 이상이면 그 중에서 가장 긴 것으로 완성된다. 검색 경로나 함수에 있는 명령이 파일명보다 우선된다.

▒ 본문 완성 명령

Command

Description

TAB

입력한 텍스트의 일반적인 본문 완성 기능 사용

ESC-?

완성 가능한 리스트 출력

ESC-/

파일명 완성 기능 사용

CTRL-X /

완성 가능한 파일명 리스트 출력

ESC-~

유저명 완성 기능 사용

CTRL-X ~

완성 가능한 유저명 리스트 출력

ESC-$

변수 완성 기능 사용

CTRL-X $

완성 가능한 변수 리스트 출력

ESC-@

호스트명 완성 기능 사용

CTRL-X @

완성 가능한 호스트명 리스트 출력

ESC-!

명령 완성 기능 사용

CTRL-X !

완성 가능한 명령 리스트 출력

ESC-TAB

히스토리 리스트에서 이전 명령어 완성 기능 사용

 

1.3.6 Miscellaneous Commands

이맥스 모드의 다양한 명령

Command

Description

CTRL-J

RETURN과 동일

CTRL-L

화면 지우고, 스크린 맨 윗줄에 커서 둠

CTRL-M

RETURN과 동일

CTRL-O

RETURN과 동일하고 명령 히스토리에 다음 행 표시

CTRL-T

점의 양쪽의 두 문자를 뒤바꿈. 점은 뒤로 이동(왼쪽)

CTRL-U

명령행 맨 왼쪽에서부터 점의 위치까지 없앰

CTRL-V

인용부호 삽입

CTRL-[

ESC와 동일(일반적인 키보드에서)

ESC-C

점 다음 워드를 대문자로

ESC-U

점 다음 워드의 모든 문자를 대문자로 변경

ESC-L

점 다음 워드의 모든 문자를 소문자로 변경

ESC-.

이전 명령행의 마지막 워드를 점 다음에 삽입

ESC-_

ESC-. 과 동일

 

CTRL-O는 이미 입력한 명령어를 반복적으로 사용할 때 유용하다. 연속된 명령의 처음으로 돌아가 CTRL-O RETURN 대신에 누른다. 현재 명령은 실행되고 다음 명령어를 히스토리 리스트에서 가져온다. 연속된 마지막 명령까지 반복하면 된다. 그리고 RETURN을 누르면 된다. 대소문자 변경 명령 중에는 ESC-L이 실수로 CAPS LOCK 키를 누르고 입력했을 때 유용하다.

1.4 vi Editing Mode

이맥스 모드와 같이 vi모드도 기본적으로 히스토리 리스트에 한 줄짜리 편집을 할 수 있다. vi 모드는 UNIX에서 표준으로 사용하기 때문에 더 많이 사용한다. 하지만 vi C 프로그램 작성을 하려고 설계되었기 때문에 사용법이 다르다.

vi 모드에 입력모드와 제어모드가 있다. 입력모드는 명령을 입력할 때 사용하는 모드이다. 제어모드는 명령행과 히스토리 리스트를 이동할 때 사용하는 모드이다. 입력 모드일 때는 명령어를 입력하고 RETURN을 누르면 된다. 제어 문자를 사용할 편집 기능으로 쉽게 사용할 수 있다.

vi 입력 모드 편집 명령

Command

Description

DEL

이전 문자 삭제

CTRL-W

이전 워드 삭제(공백까지 삭제)

CTRL-V

다음 문자 인용

ESC

제어 모드 시작

 

vi 모드에서는 “삭제” 명령으로 “이전 문자 삭제” 키를 사용한다. 보통 DEL 이나 CTRL-H(BACKSPACE)로 설정 되어 있다.

CTRL-V는 이맥스 모드와 동일하게 동작한다. 다음 문자가 특수문자로서 의미를 잃어버리게 해 있는 그대로 보이게 한다. 입력 모드에서 입력한 명령을 변경하려면 제어 모드로 해야 하는데 ESC를 누르면 된다.

1.4.1 Simple Control Mode Commands

제어 모드에서 vi 편집 명령을 모두 사용할 수 있다. vi 모드에서 워드는 두 가지 개념이다. 하나는 공백 문자가 없는 문자의 연속이고, 다른 하나는 영숫자, 밑줄문자(_)의 연속이나 영숫자가 아닌 문자의 연속를 말한다.

▒ 기본적인 vi 제어 모드 명령

Command

Description

h

한 문자 왼쪽으로 커서 이동

l

한 문자 오른쪽으로 커서 이동

w

한 워드 오른쪽으로 커서 이동

b

한 워드 왼쪽으로 커서 이동

W

다음 공백없는 워드 첫 문자로 이동

B

이전 공백없는 워드 첫 문자로 이동

e

현재 워드의 마지막 문자로 이동

E

현재 공백 없는 워드의 마지막 문자로 이동

0

명령행의 맨 왼쪽으로 이동

^

명령행에서 공백없는문자가 아닌 첫 문자로 이동

$

명령행의 맨 끝으로(오른쪽) 이동

 

이 명령어들 중에 마지막 3(0, ^, $)를 제외한 나머지는 반복 횟수를 가리키는 숫자를 먼저 누르고 사용할 수 있다.

명령행을 입력하고 RETURN을 누리기 전에 바꿔야겠다고 결정했다고 하자.

$ grep -l Duchess < ~cam/book/alice_in_wonderland!

워드의 개념의 어떻게 다른지 보자.

$를 입력하여 커서를 맨 끝으로 이동 시킨다. b를 입력하면 워드는 alice_in_wonderland가 되고 커서는 a에 있게 된다.

$ grep -l Duchess < ~cam/book/alice_in_wonderland

다시 b를 입력하면 다음 워드는 슬래시(/)가 된다(영숫자가 아닌 문자들의 연속이므로)

$ grep -l Duchess < ~cam/book/alice_in_wonderland

b대신에 B를 입력하면 공백없는워드는 전체 경로명이 되고 커서는 이 워드의 시작문자인 ~에 놓임.

$ grep -l Duchess < ~cam/book/alice_in_wonderland

 

1.4.2 Entering and Changing Text

vi 입력 모드로 들어가는 명령

Command

Description

i

현재 문자 이전에(왼쪽) 텍스트 입력(insert)

a

현재 문자 이후에(오른쪽) 텍스트 입력(append)

I

명령행 맨 처음(맨 왼쪽) 시작에 텍스트 입력

A

명령행 맨 마지막(맨 오른쪽)에 텍스트 입력

R

현재 텍스트에 텍스트 덮어씀

소문자 r은 한 문자만 변경

 

1.4.3 Deletion Commands

vi 모드에서 삭제 명령

Command

Description

dh

왼쪽으로 한 문자 삭제

dl

오른쪽으로 한 문자 삭제

db

왼쪽으로 한 워드 삭제

dw

오른쪽으로 한 워드 삭제

dB

이전 공백없는워드 삭제

dW

다음 공백없는워드 삭제

d$

현재 위치에서 명령행 맨 오른쪽까지 삭제

d0

현재 위치에서 명령행 맨 왼쪽까지 삭제

vi 모드에서 삭제 축약 명령

Command

Description

D

d$와 동일(현재 위치에서 명령행 맨 오른쪽까지 삭제)

dd

0d$와 동일(전체 명령행 삭제)

C

c$와 동일(현재 위치에서 명령행 맨 오른쪽까지 삭제. 입력 모드 시작)

cc

0c$와 동일(전체 명령행 삭제, 입력 모드 시작)

X

dl와 동일(왼쪽으로 한 문자 삭제)

x

dh와 동일(오른쪽으로 한 문자 삭제)

 

1.4.4 Moving Around in the History List

▒ 명령 히스토리 검색용 vi 제어 모드 명령

Command

Description

k or -

이전 명령행으로 이동

j or +

다음 명령행으로 이동

G

반복 횟수만큼 명령행 이동

/string

string을 이전 명령행부터 뒤로 찾음

?string

string을 다음 명령행부터 찾음

n

이전에 했던 방향으로 검색 반복

N

이전에 했던 방향과 반대로 검색 반복

 

1.4.5 Character-Finding Commands

vi 모드 문자 검색 명령

Command

Description

fx

x 문자가 있는 오른쪽으로 이동

Fx

x 문자가 있는 왼쪽으로 이동

tx

x 문자가 있는 오른쪽으로 이동한 다음 한 문자 왼쪽으로 커서 이동

Tx

x 문자가 있는 왼쪽으로 이동한 다음 한 문자 오른쪽으로 커서 이동

;

마지막으로 내린 문자 검색 명령 다시 실행

,

마지막으로 내린 문자 검색 명령 반대로 다시 실행

1.4.6 Textual Completion

본문 완성 기능의 전제는 간단하다. 많은 파일명, 유저명 등의 입력을 분명하게 구별할 수 있다는 것이다.

vi 모드에서는 역슬래시 문자(\)를 사용하여 명령 한다. 텍스트의 일부를 입력하고 ESC를 누르면 제어모드를 시작하고 \를 입력하면 다음 4가지 중 하나가 일어난다. 이맥스 모드에서 TAB을 누른 경우와 같다.

1. 입력한 단어로 시작하는 전체 이름이 아무것도 없을 때에 쉘은 삑 소리가 나고 더 이상 아무것도 일어나지 않는다.

2. 명령 구문이 검색 경로에 있거나, 함수명, 파일명과 딱 맞는 명령이 있을 때 나머지 부분이 완성된다. 완성된 명령어 뒤에 공백이 하나 붙어 인자를 입력할 수 있게 된다. 본문 완성 기능은 명령 위치에 있을 때만 적용된다.

3. 입력한 구문과 일치하는 디렉토리가 있을 경우 파일명을 완성하고 슬래시(/)가 붙는다.

4. 입력한 구문과 일치하는 경우가 두 가지 이상이면 그 중에서 가장 긴 것으로 완성된다. 검색 경로나 함수에 있는 명령이 파일명보다 우선된다.

1.4.7 Miscellaneous Commands

vi 제어 모드에서 다양한 명령

Command

Description

~

현재 문자를 대문자에서 소문자로, 소문자에서 대문자로 변경

_(밑줄)

이전에 내린 명령행에서 마지막 워드를 현재 명령행에 끼워 넣은 다음 입력 모드 시작

CTRL-L

화면을 지우고 현재 명령행을 다시 표시.

#

주석 문자를 명령행 앞에 붙여 히스토리 파일에 추가. 다시 입력하지 않고 나중에 실행할 명령을 보관하는데 사용

 

1.5 The fc Command

fc C쉘의 히스토리 구조를 강력하게 제공하는 내장 쉘 명령을 말합니다.

이 명령어를 사용해서 가장 최근의 입력했던 명령어들을 검사할 수 있고, 하나 혹은 이상의 명령어들을 당신이 즐겨하는 에디터로 또 다시 전체 명령문을 입력하지 않고 변경할 수 있습니다.

fc 명령에는 –l 옵션으로 이전 명령어들을 목록을 작성한다. 히스토리 리스트에 있는 명령어를 가리키는 인자가 필요하다. 인자는 숫자나 문자나 숫자로 된 문자열을 말한다. 숫자는 히스토리 리스트에서 명령을 가리키고, 반면에 문자열은 그 문자열로 시작하는 가장 최근의 명령을 가리킨다. fc 명령어는 인자를 다루는 방법이 다소 복잡하다.

인자가 2개면, 처음과 마지막 명령어를 보여주는 역할을 한다

숫자 인자 하나면, 숫자에 해당하는 명령어만 보인다.

문자열 인자 하나면, 이 문자열로 시작하는 가장 최근의 명령행을 찾고 이 명령어 이후 가장 최근 명령어까지 모두 보여준다.

아무런 인자가 없다면, 마지막에 입력한 16개의 명령어를 보여준다.

예를 들어, 로그인해서 입력한 명령어들이다.

ls –l
more myfile
vi myfile
wc –l myfile
pr myfile | lp –h

 

fc l 을 아무 인자 없이 누르면, 명령어와 함께 숫자가 붙어 보여진다.

1    ls –l
2    more myfile
3    vi myfile
4    wc –l myfile
5    pr myfile | lp –h

-n 옵션을 붙이면 숫자를 안 보이게 할 수 있다. 2번부터 4번까지 명령어만 보고 싶다면, fc l 2 4 라고 하면 된다. vi 명령어인 3번 명령어를 보고 싶다면, fc l 3을 누르면 된다. vi 명령어 이후까지 보려면 fc l vi 라고 하면 된다.

일반적으로 fc는 최근 명령어를 수정할 때 사용한다.

아무런 인자가 없다면, fc 명령어는 가장 최근의 명령어를 편집기로 적재한다.

숫자 인자가 하나면 fc 명령어는 그 숫자에 해당하는 명령어를 편집기로 적재한다.

문자열 인자가 하나면 fc 명령어는 그 문자로 시작하는 가장 최근 명령어를 편집기로 적재한다.

인자가 2개면 fc 명령어는 명령어의 범위를 지정한다.

fc 가 명령어들을 편집 후에 실행하는 것을 기억하라. 배시는 편집기를 종료할 때 지정한 범위의 모든 명령어를 실행한다. 여러 줄로 구성하면 더욱 위험한 결과가 발생될 수도 있다.

fc ln 을 사용하여 수정 후에 명령어를 실행해야만 한다.

$ fc –ln cp > lastcommands
$ vi lastcommands
$ source lastcommands

 

fc s는 명령어를 다시 실행할 수 있다. 인자가 있으면 그 문자열로 시작하는 마지막 명령을 실행하고 인자가 없으면 이전 명령을 실행한다.

 

1.6 History Expansion

히스토리 확장의 기본적인 방식은 히스토리 리스트에서 명령어를 다시 불러 편집할 때 사용한다. 명령어를 다시 불러들일 때 이벤트 지정자를 이용한다.

▒ 이벤트 지정자

Command

Description

!

히스토리 대체 시작

!!

마지막 명령 실행

!n

n번째 행 명령 실행

!-n

현재 행에서 빼기(뒤로) n번째 행 실행

!string

string으로 시작하는 가장 마지막 명령 실행

!?string?

string을 포함하는 가장 마지막 명령, string뒤에 ?는 옵션

^string1^string2

string1string2로 변경하고 가장 마지막 명령 반복

이 중에서 가장 쓸모있는 명령어는 !! 이다. !!를 입력하면 마지막 실행했던 명령어를 다시 실행한다. 어떤 명령의 명령 번호를 알고 있다면 !n을 이용할 수 있다(n은 명령행 번호이다). 명령의 번호는 history 명령어로 알아낼 수 있다. 그렇지 않으면 !string을 사용해서 가장 최근 명령 중에서 지정한 문자열로 시작하는 명령행을 재실행 할 수 있다.

예를 들어, 이렇게 입력했다고 하자. looking loking으로 잘못 입력했을 때.

$ cat through_the_loking_glass | grep Tweedledee > dee.list

^lok^look이라고 입력하면 이전 행으로 가 loking looking으로 변경 후 실행한다.

워드 지정자를 사용하면 이전 명령어에서 어떤 워드를 조회할 수 있다.

▒ 워드 지정자

Command

Description

0

0번째 워드

n

n번째 워드

^

첫째 인자(두 번째 워드)

$

마지막 인자

%

가장 최근의 ?string 을 검색하여 일치하는 워드

x-y

x부터 y까지 워드 범위 중에서 –y 0-y에 동의어

*

0번째를 제외한 모든 워드. 1-$와 동의어. 워드가 하나 밖에 없으면 빈 값을 반환해준다.

x*

x-$와 동의어

x-

x부터 마지막 워드 전까지 모든 워드

워드 지정자는 이벤트 지정자 뒤에 따르고 :(콜론)으로 구분된다. 예를 들어, 이전 명령행을 반복할 때는 !!:0을 입력한다.

▒ 한정어

Command

Description

h

앞 부분은 남겨두고 후행 경로명 삭제

r

.xxx 형태에서 후행 접미사 삭제

e

접미사 제외하고 모두 삭제

t

뒷부분 남겨두고 모든 경로명 삭제

p

결과 명령을 출력하고 실행시키지는 않는다.

q

대체된 워드를 인용 처리. 나머지 이스케이프 제어

x

대체된 워드를 인용 처리. 그것들을 공백과 개행으로 나눔

s/old/new/

old new로 대체

 

1.7 readline

배시의 명령행 편집 인터페이스를 readline이라 한다. 텍스트 기반의 인터페이스를 필요로 하는 어플리케이션에 의해 사용할 수 있는 GNU 프로젝트를 위해 개발된 소프트웨어의 라이브러리이다. 사용자가 텍스트를 편집하고 입력하는 것을 좀 더 쉽게 만들기 위해 편집 기능과 텍스트 조작 기능을 제공한다. 이것을 사용하는 모든 어플리케이션에 미치며 키보드 치기와 사용자 정의 방법에 있어 표준화를 가능하게 했다.

1.7.1 The readline Startup File

기본 시작 파일은 .inputrc이고 사용자 홈 디렉토리에 항상 존재해야만 readline을 사용자 정의할 수 있다. INPUTRC 환경 변수 설정하여 기본 파일명을 변경할 수 있다.

배시가 시작할 때, 그 시작 파일을 읽고(그것이 있다면) 설정에 영향을 미친다. 시작 파일은 단지 여러 행의 묶음으로 키 이름을 매크로나 readline 함수명에 묶는 것이다. 주석을 달려면 맨 앞 줄에 #을 넣으면 된다.

키 이름이나 키 이스케이프 시퀀스는 키이름으로 사용할 수 있다.

예를 들어, CTRL-T를 현재 행의 맨 끝(오른쪽)으로 이동하는 명령으로 묶으려면 .inputrc 파일에 Control-t: end-of-line 이라고 입력한다. 키 이스케이프 시퀀스를 사용하라면 “\C-t<>:end-of-line 이라고 입력한다. \C는 키보드의 CTRL 키에 해당하는 이스케이프 시퀀스이다. 이런 키 시퀀스의 장점은 동작에 키 시퀀스를 지정할 수 있다. 예시의 readline을 다시 읽으면 CTRL-T를 누르면 커서는 행의 맨 오른쪽으로 이동할 것이다.

앞의 예에서 end-of-line readline의 함수이다. 커서 이동에 관한 것에서 텍스트 변경과 명령 완성까지 모든 제어가 가능한 60개 이상의 함수가 있다. 이맥스나 vi 편집모드의 명령은 모두 readline 함수와 관련이 있다. 쉘의 기본 모드를 사용자 설정할 수도 있고 사용자만의 새로운 키 시퀀스로 완전히 만들 수도 있다.

readline은 키 시퀀스를 매크로로 묶을 수도 있다. 매크로는 작은 따옴표나 큰 따옴표 안에 일련의 키조작이다. 키 시퀀스를 입력하면 사용자가 입력해둔 매크로가 실행된다. 예를 들어 CTRL-T에 어떤 내용을 묶을 수 있는데 “\C-t<>:<>Curiouser and curouser!<> 라고 입력한다. CTRL-T를 누르면 Curiouser and curiouser! 가 명령행에 나타날 것이다.

매크로나 키 시퀀스에 작은따옴표나 큰따옴표를 사용하고 싶다면 백슬래시(\)를 이용하여 이스케이프 처리한다.

▒ 이스케이프 시퀀스(역슬래시와 영문자 또는 숫자로 이루어진 문자 조합으로 개행 문자, 작은 따옴표 등 다른 문자를 나타내기 위해 이용)

\

Description

\C-

컨트롤 키

\M-

ESC

\e

이스케이프 문자

\\

역슬래시 문자(\)

\<”>

큰 따옴표

\’

작은 따옴표

 

readline에는 자체 변수가 있다. .inutrc에서 설정할 있다.

readline 변수

Command

Description

bell-style

none으로 설정하면 readline은 삑 소리가 나지 않는다. visible로 설정하면 readline은 사용 가능한 경우 비주얼 벨을 사용한다. audible이라고 설정하면 삑 소리가 난다. 기본값은 audible 이다.

comment-begin

insert-comment 명령을 실행할 때 입력되는 문자열이다. 기본값은 # 이다.

completion-query-items

입력한 값보다 자동완성 횟수가 크면 계속 진행할지를 사용자에게 묻는다. 기본값은 100이다.

convert-meta

On으로 설정하면 8번째 비트를 제거하고 이스케이프 문자를 붙여 8번째 비트 집합을 아스키 키 시퀀스로 변환한다. 기본값은 On이다.

disable-completion

On으로 설정하면 자동 완성 기능 사용을 못하게 한다. 자동 완성에서 입력한 문자는 그냥 입력된다. 기본값은 Off이다.

editing-mode

편집 모드를 vi emacs 모드로 설정한다.

enable-keypad

On으로 설정하면 키보드의 키패드를 사용할 수 있게 된다. 일부 시스템에서는 On으로 설정해야 사용할 수 있다. 기본값은 Off이다.

expand-tilde

On으로 설정하면 내용 자동 완성 중에 틸드 확장을 한다. 기본값은 Off이다.

horizontal-scroll-mode

On으로 설정하면 화면의 오른쪽 끝을 넘어 입력할 때 화면이 가로 스크롤이 된다. 기본값은 Off이고 다음 행으로 넘어간다.

input-meta

On으로 설정하면 8비트를 입력할 수 있다. 기본값은 Off이고, meta-flag와 동의어이다.

keymap

readline의 현재 키맵을 바인딩에 설정한다. 기본 이름은 emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, vi-command, vi-insert이다. 기본값은 emacs이다. editing-mode 값은 key-map에 영향을 미친다.

mark-directories

On으로 설정하면 완성한 디렉토리 명에 슬래시가 붙는다.

mark-modified-lines

On으로 설정하면 수정했다는 것이 히스토리 파일에 아스트리크(*)로 표시된다. 기본값은 Off이다.

meta-flag

On으로 설정하면 8비트를 입력할 수 있다. 기본값은 Off이다.

output-meta

On으로 설정하면 8번째 비트 집합의 문자를 바로 표시한다. 기본값은 Off이다.

show-all-if-ambiguous

On으로 설정하면 삑 소리가 나지 않고 두 가지 이상 자동완성 가능한 워드를 목록화한다. 기본값은 Off이다.

visible-stats

On으로 설정하면 자동 완성 가능한 목록을 출력할 때 파일명 뒤에 stat 시스템 콜이 알려주는 파일 종류를 가리키는 문자가 붙는다. 기본값은 Off이다.

 

1.7.2 Key Binkdings Using bind

키 바인딩을 하거나 현재 설정을 확인하는 명령에 bind가 있다. bind의 문법은 .inputrc 파일에서 한 것과 같지만 따옴표로 인자를 묶어 하나의 인자로 처리해야 한다.

CTRL-T를 어떤 문자열로 묶으려면 bind ‘”\C-t<>:<>Curiouser and curiouser!”’ 라고 입력한다. .inputrc 파일에 묶는 것과 다른 것은 현재 쉘에서만 적용되고 로그아웃되면 중단된다.

bind P를 입력하면 현재의 바인딩 정보를 화면에 출력한다. bind l을 입력하면 readline 함수명을 볼 수 있다. bind u는 함수의 이름을 가지고 함수를 바인딩 해제할 수도 있습니다. 함수의 모든 키를 바인딩 해제할 것입니다. 바인딩 해제된 키 시퀀스는 bind r로 시퀀스에 따라 끝낼 수 있습니다.

-p 옵션은 bind를 다시 읽어 들일 수 있거나, .inputrc 파일에 사용할 수 있는 형식으로 바인딩

설정 상태를 표준 출력한다. f 옵션은 파일을 다시 읽을 때 사용한다. 이 옵션은 파일명을 인자로 받아 파일에 키 바인딩을 읽는 일을 한다. .inputrc를 수정한 뒤에 키 바인딩을 업데이트 할 때 사용한다.

 

1.8 Keyboard Habits

이 장에서 우리는 배시의 명령행 2가지 편집 모드인 vi emacs에 대해서 살펴봤다. 왜 두 가지 편집기를 왜 선택했는지 궁금해 할 것이다. 주요한 이유는 UNIX에서 vi emacs는 가장 널리 사용되는 편집기이기 때문이다. 이 편집기들을 사용한 사용자들은 익숙한 편집기를 찾기 때문이다.

몇 시간 정도만 키보드 조작을 배우는데 쓴다면, 명령행 편집 기능 없이 해냈는지 궁금해할 것이다.

 

'BashShell Programming' 카테고리의 다른 글

6. Command-Line Options and Typed Variables  (0) 2011.04.20
챕터 5. 흐름 제어  (0) 2011.04.19
4. Basic Shell Programming  (0) 2011.02.21
3. Customizing Your Environment  (0) 2011.01.25
Learning the bash Shell 정리 - 1장  (0) 2011.01.07