Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

Bash 히스토리 명령어 완벽 활용 가이드

Bash는 유서 깊은 셸입니다. 그 자체로도 오래된 셸이지만, 그 조상인 Bourne 셸보다도 더 긴 역사를 지니고 있습니다. 동시에 Bash에는 다른 어떤 셸의 히스토리 인터페이스보다 뛰어난 기능을 갖춘 history 명령어가 포함되어 있습니다. Bash 버전의 history 명령어는 역방향 검색, 빠른 재호출, 히스토리 수정 등 다양한 기능을 제공합니다.

history 명령어는 일반적인 명령어와는 조금 다릅니다. 보통 명령어들은 /usr/bin, /usr/local/bin, ~/bin 같은 시스템 공용 경로에 위치한 실행 파일입니다. 하지만 내장 명령어인 historyPATH 환경 변수에 등록되어 있지 않으며, 물리적인 파일 위치도 존재하지 않습니다.

$ which history

which: no history in [PATH]

대신 history는 셸 자체에 내장된 함수입니다.

$ type history
history is a shell builtin
$ help history
history: history [-c] [-d offset] [n] or
history -anrw [filename] or
history -ps arg [arg...]

Display or manipulate the history list.
[...]

이러한 이유로 각 셸의 히스토리 기능은 서로 고유합니다. 즉, Bash에서 사용하는 방법이 Tcsh, Fish, Dash에서는 작동하지 않을 수 있고, 그 반대의 경우도 마찬가지입니다. 하지만 Bash의 기능을 알아두면 다른 셸 사용자들이 이를 모방하는 흥미로운 방법을 만들어내는 영감이 되기도 하고, 본인도 몰랐던 Bash의 숨겨진 기능들을 발견하게 될 수도 있습니다.

Bash 히스토리 조회하기

history 명령어의 가장 기본적이고 빈번한 용도는 셸 세션의 명령 기록을 확인하는 것입니다.

$ echo "hello"
hello
$ echo "world"
world
$ history
1 echo "hello"
2 echo "world"
3 history

이벤트 지정자(Event Designators)

이벤트 지정자는 히스토리를 이벤트 단위로 검색합니다. 여기서 이벤트란 히스토리에 기록된 하나의 명령어를 의미하며, 줄바꿈 문자로 구분됩니다. 다시 말해 한 줄의 명령어가 인덱스 번호와 함께 참조 가능한 형태로 저장되는 것입니다.

이벤트 지정자는 대부분 느낌표(!, 흔히 'bang'이라고도 불립니다)로 시작합니다.

인덱스 번호로 명령어 다시 실행하기

히스토리에 있는 명령어를 다시 실행하려면 느낌표 바로 뒤(공백 없이)에 원하는 명령어의 인덱스 번호를 입력합니다. 예를 들어 1번째 줄에 echo "hello" 명령어가 있고, 이를 다시 실행하고 싶다면 다음과 같이 입력합니다.

$ !1
echo "hello"
hello

상대 위치로 명령어 불러오기

음수를 사용하면 현재 위치에서 상대적으로 거슬러 올라간 위치의 명령어를 실행할 수 있습니다. 예를 들어 히스토리에서 세 항목 뒤로 돌아가려면 다음과 같이 합니다.

$ echo "foo"
foo
$ echo "bar"
bar
$ echo "baz"
baz
$ !-3
echo "foo"
foo

단 한 줄 뒤로만 돌아가는 경우라면 !-1 대신 단축형 !!을 사용할 수 있습니다. 무려 타이핑 한 번을 아끼는 셈이죠!

$ echo "foo"
$ !!
echo "foo"
foo

인덱스 번호 대신 특정 문자열을 기준으로 히스토리를 역방향으로 검색하여 명령어를 찾아 실행할 수도 있습니다. 특정 문자열로 시작하는 명령어를 검색하려면 느낌표 바로 뒤(공백 없이)에 검색할 문자열을 입력합니다.

$ echo "foo"
$ true
$ false
$ !echo
echo "foo"
foo

명령어의 시작이 아니라 어느 위치든 문자열을 포함하는 명령어를 검색할 수도 있습니다. 이 경우에도 마찬가지로 !와 검색 문자열을 사용하지만, 문자열 양쪽을 물음표(?)로 감싸야 합니다. 검색 문자열 바로 뒤에 줄바꿈 문자가 온다는 것을 알고 있다면(즉, Enter 키를 누르기 전 마지막으로 입력한 내용이라면) 뒤쪽 물음표는 생략해도 됩니다.

$ echo "foo"
$ true
$ false
$ !?foo?
echo "foo"
foo

문자열 치환

줄 시작 부분의 문자열을 검색하는 것과 유사하게, 문자열을 검색한 후 새 문자열로 교체하여 명령어 자체를 변경할 수도 있습니다. 캐럿(^) 기호를 활용하면 이전 명령어의 특정 부분만 바꿔서 빠르게 재실행할 수 있습니다.

$ echo "hello"
hello
$ echo "world"
world
$ ^hello^foo
echo "foo"
foo

히스토리를 제대로 활용하기

Bash의 history 명령어는 여기서 소개한 것보다 훨씬 더 많은 기능을 갖추고 있지만, 위의 내용만으로도 히스토리를 단순한 '참고 자료'가 아닌 실제로 활용하는 도구로 만들기에 충분한 시작점이 됩니다. history 명령어를 자주 사용해 보세요. 명령어를 직접 타이핑하지 않고도 얼마나 많은 작업을 처리할 수 있는지 스스로 놀라게 될지도 모릅니다.