히스토리

대부분의 쉘은 이전에 입력했던 명령어를 반복하거나 그것들을 약간 변형하여 다시 사용할 수 있도록 하는 히스토리라는 강력한 기능이 있다. 이러한 기능은 복잡하거나 긴 명령어를 입력할 때 매우 유용하다.

bash는 ~/.bashrc에 HISTSIZE라는 값으로 히스토리의 사이즈를 정하고 있다.

$ cat ~/.bashrc | grep HISTSIZE
HISTSIZE=1000

history 명령어는 이전에 입력한 명령어들을, 쉘이 실행된 후 몇 번째로 입력된 명령어인가를 나타내는 번호화 함께 출력한다. history뒤에 숫자를 붙이면 출력 갯수를 제한할 수 있다.

$ history 4
 2117  ls
 2118  lsㅣㅑ
 2119  ll
 2120  cat ~/.bashrc | grep HISTSIZE

!$

히스토리 치환에서 !$는 마지막으로 입력한 명령행의 맨 끝 인자를 의미한다. Unix의 대부분의 명령어들의 마지막 인자는 어떤 파일의 이름이다. 따라서 마지막에 입력한 명령행에 사용했던 파일명을 또 사용하고자 한다면 매우 편리하게 사용할 수 있다.

$ mkdir ~/throughkim/testfolder
$ cd !$
cd ~/throughkim/testfolder

위와 같이 새로운 폴더를 생성하고 !$를 적어주면 만들어 준 경로로 쉽게 이동할 수 있다.

!:n*

이전 명령어의 n번째 부터 마지막 인자까지 반환해준다.

$ cat afile bfile cfile dfile
this is a file
this is b file
this is c file
this is d file

$ grep -i file !:3*
grep -i file cfile dfile
cfile:this is c file
dfile:this is d file

위의 예시를 보면 알 수 있듯이 !:3*을 입력해 주면 3번째 인자파일부터 마지막 인자파일까지 grep을 실행했음을 알 수 있다.

^^

$ cat myflie
cat: myflie: No such file or directory
$ ^li^il
cat: myfile

li를 il로 바꾸라는 의미이다. 왼쪽부터 인덱싱 하여 일치하는 첫번째 문자열을 변환한다.

$ cat myfileee
cat: myfileee: No such file or directory
$ ^ee
cat myfile

치환하고자 하는 문자가 없으면(해당 문자를 지우고 싶으면) 두번째 ^를 붙이지 않아도 되며, 일치하는 문자는 삭제된다.

와일드카드의 안전한 사용을 위해 !$사용하기

$ ls a*
afile aafile
$ rm !$

위와 같이 와일드카드를 이용한 삭제를 할 때 ls명령어를 통해 확인해보고 해당 파일을 삭제하도록 하면 안전하다.

히스토리 치환

느낌표(!)는 주로 히스토리 치환에 사용되는 문자이다. 히스토리 기능은 이전에 입력된 명령어들을 간단히 다시 실행시킬 수 있도록 돕는다. 쉘이 히스토리를 몇 개 까지 기억할 것인지 정하려면 쉘 설정 파일에 아래와 같이 입력해주면 된다.

set history=40  # C쉘
HISTSIZE=40     # bash, ksh

!를 이용해 이전에 입력된 명령행 전체나 그 부분을 다시 사용하는 방법은 여러가지가 있다. 주로 앨리어스를 정의할 때 명령행으로부터 인자를 가져오는데 사용된다.

  • !!는 마지막 명령행을 반복한다.
  • !:도 마지막 명령행을 반복한다. 이것은 명령행을 변경하기 위한 변환자를 사용할 때 자주 이용된다.
  • !so는 히스토리 중 so로 시작하는 가장 최근의 것을 반복한다.
  • !?fn?은 히스토리중 중 fn을 포함하는 것 중 가장 최근의 것을 반복한다.
  • !34는 번호 34번째 히스토리를 반복한다.
  • !!&는 마지막 명령행을 백그라운드에서 반복한다.

명령어 사이클 반복

!!는 바로 이전에 입력한 명령행을 실행한다. 가’끔 2개의 이전 명령어를 반복하여 수행하는 경우가 있다. 이런 경우에는 !-2를 사용하면 매우 편리하다.

$ cat afile
this is afile
$ cat bfile
this is bfile
$ !-2
this is afile
$ !-2
this is bfile

:p를 사용해 히스토리 확인하기

!ca를 입력했을 때 내가 원하는 명령행이 실행되리라는 확신을 하기 힘들다. 따라서 :p를 이용해 어떤 명령어가 실행될 것인지 확인해보는 것이 도움이 된다.

$ !ca:p
cat ./* | grep file

히스토리 치환 끝이 :p를 붙임으로써 명령어를 실행하지 않고 단순히 치환 결과만을 출력하게 했다. 이제 확인을 했으면 !!를 이용해 바로 실행할 수 있다.

로그아웃 할 때 히스토리 남겨놓기

  • C쉘에서는 savehist라는 쉘 변수에 저장하고 싶은 히스토리 명령행 개수를 지정하면 된다.
  • Korn쉘과 bash에서는 자동적으로 히스토리가 저장됨.
  • C쉘의 경우 로그아웃 할 때 지정한 개수만큼 히스토리 명령행이 홈 디렉토리에 .history라는 파일로 저장된다.
  • bash와 ksh는 HISTFILE이라는 환경변수에 지정된 파일명으로 저장되는데 기본값은 bash_history, .sh_history이다.
through.kim's profile image

through.kim

2016-12-23 14:35

Read more posts by this author