Child pages
  • bash 명령어 히스토리 관리 - readline 사용법 및 line 편집, reverse search 등 단축키 요약


개요

Linux 가 다른 Unix 보다 좋은 점 중에 하나는 bash 가 기본 쉘이라는 것이다.

 다른 쉘에 비해 bash 의 장점은 무지 많지만 그중에 line-editing 이나 커맨드로 예전 명령어를 불러내는 history 기능은 명령어 기반으로 사용하는 Unix 의 특성상 편리성을 극대화시키고 실수를 최소화해준다. 


bash의 편리한 command line 능력은 readline library 라는 별도의 library 로 처리되며 command 기반으로 동작하는 program 을 만들일이 있다거나 program 에 shell interface 를 붙이거나 할 경우 readline library 를 사용하여 사용자 편의성을 높일수 있다. (Ex: mysql 에 내장된 mysql 명령어)


readline 설정

readline 은 동작에 관한 설정을 $HOME/.inputrc 파일에 지정하고 있다.


# 으로 시작하는 라인은 comments 로 처리되며 설정은 다음과 같은 형식을 따른다.


$ set variable value


 bash 에서 readline 관련 현재 설정을 확인하려면 bind -V  명령어를 수행하면 된다.


root@centos6:~:> bind -V


bind-tty-special-chars is set to `on'
blink-matching-paren is set to `on'
byte-oriented is set to `off'
completion-ignore-case is set to `off'
convert-meta is set to `off'
...


Key Binding

readline 에서 사용하는 key binding 은 bind -p 옵션으로 확인할수 있다.


root@centos6:~:> bind -p


"\C-a": beginning-of-line
"\C-x)": end-kbd-macro
"\e>": end-of-history
"\C-e": end-of-line
"\eOF": end-of-line
"\e[4~": end-of-line
"\e[8~": end-of-line
"\e[F": end-of-line
...


기본적으로 key binding 을 변경할 일이 거의 없을 것이고 key mapping 중 화살표 키를 이용한 history 기능은 많이 쓰지만 line-editing 은 안쓰는 경우가 많은거 같아서 유용한 몇가지 key를 정리해 본다.

line editing 과 reverse search 기능을 사용하면 예전 명령어를 아주 쉽게 재활용이 가능하며 이는 작업자의 타이핑 실수를 방지하고 높은 생산성을 보장해준다.

(lightbulb) (\C는 Ctrl key, \e 는 Esc Key 이다)


주요 단축키 목록

Keyaction비고
\C-a line 의 처음으로 가기
\C-e line 의 끝으로 가기
\C-lclear screen
\C-p예전 history로 가기화살표의 ↑ 동일 ("\e[A")
\C-n다음 history로 가기화살표의 ↓동일("\e[B")
\C-rreverse search history예전에 사용했던 명령어를 가장 오래된 명령어부터 검색(increment search)
\C-sforward search history

예전에 사용했던 명령어를 가장 최근 명령어부터 검색(increment search).

터미널의 STOP 문자와 충돌하므로 하단의 i-search 항목을 참고하여 수정

\e-uline의 문자를 대문자로 변경
\e-lline의 문자를 소문자로 변경
\C-w이전 단어 삭제
\C-sreverse incremental search
\C-greverse incremental search 중지


readline 사용 예

find . \( -name "*.py" -o -name "*.html" \) 같이 긴 명령어가 있을 때 수정이 필요할 경우 Ctrl-a 키를 누르면 라인의 첫 줄로 가고 Ctrl-e 를 누르면 라인의 마지막으로 이동한다.


예전에 실행한 명령어를 순차적으로 검색하려면 C-r 을 누른 후에 찾을 예전 명령어를 한 자씩 입력하여 찾을 수 있다.



readline 의 주요 기능

명령어 history 호출

화살표 키를 이용하여 최근에 사용했던 명령어 목록을 불러올 수 있다. 위 단축키 목록위의 Ctrl-p 또는 위쪽 화살표를 누르면 된다. Ctrl-n 이나 아래 화살표(↓)는 다음 history 로 이동하게 된다.

history 명령어

bash 의 내장 명령어로 옵션없이 실행하면 실행한 모든 history 의 목록을 표시한다. history 파일은 HISTFILE 환경 변수에 의해 지정되며 특별히 지정하지 않을 경우 ${HOME}/.bash_history 에 저장된다.

history option

명령어의미사용예
history -chistory 목록을 모두 지운다.
history -d offsetoffset 으로 주어진 history 목록의 명령어를 지운다.history -d 3
history -w현재 shell 의 history 를 history 파일 에 저장한다. 예전 history 데이타는 덮어쓴다.


예전에 사용했던 명령어를 재호출할때 보통 화살표키를 눌러서 찾는 명령어가 나올때까지 history 를 조회한다.

reverse-i-search를 누르면 전에 사용했던 명령어 목록중 원하는 문자를 입력하면 점진적으로 검색해 준다. 다음 예를 보면 쉽게 이해가 될 것이다.

  1. 현재 history 에 100개의 목록이 등록되어 있다.
  2. 찾고자 하는 명령어는 54번째에 있는데 해당 명령어는 find . -name \*.xml 이다.
  3. 화살표 키를 이용하면 54번을 눌러야 한다.
  4. Ctrl-r 키를 눌러서 다음과 같이 Reverse-i-search 모드로 들어간다. (Prompt 가 없어지고 아래와 같이 입력창이 뜬다.

    (reverse-i-search)`': 
  5. incremental search 이므로 한 글자를 입력할때 마다 해당하는 명령어를 보여준다. 

    (reverse-i-search)`fi': find . -name \*xml
  6. 호출하고자 하는 명령어가 나올때까지 예전 명령어를 입력후 나왔으면 엔터를 쳐서 찾은 명령어를 수행한다.


위와 반대로 history 에서 forward increment search 를 수행하며 기본 매핑키는 Ctrl-s 이나 터미널의 STOP 키와 충돌하여 동작하지 않는다. (stty -a 로 확인 가능)

readlne 의 기본 키인 Ctrl-s 를 동작하게 하려면 터미널에서 다음 명령을 수행한다.

$ stty stop ''

또는 bash 의 로그인 설정(.bash_profile) 파일에 위 내용을 추가한다.


http://vaab.blog.kal.fr/2010/11/11/enabling-ctrl-s-for-forward-history-search-in-bash/ 참고

참고 자료