리눅스 터미널에서 Bash를 사용하면 최근에 어떤 작업을 했는지 추적할 수 있는 내장 히스토리 기능이 제공됩니다. 현재 Bash 세션의 명령어 기록을 확인하려면 내장 명령어인 history를 입력하면 됩니다:
$ echo "foo"
foo
$ echo "bar"
bar
$ history
1 echo "foo"
2 echo "bar"
3 history
history 명령어는 대부분의 명령어와 달리 파일 시스템에 존재하는 실행 파일이 아니라 Bash 자체의 기능입니다. type 명령어로 이를 직접 확인할 수 있습니다:
$ type history
history is a shell builtin
히스토리 관리하기
셸 히스토리에 저장되는 최대 줄 수는 HISTSIZE 변수로 결정됩니다. 이 변수는 .bashrc 파일에서 설정할 수 있습니다. 아래 설정은 히스토리를 3,000줄로 지정하며, 한도를 초과하면 가장 오래된 항목이 삭제되고 새로운 명령어가 목록 맨 아래에 추가됩니다:
export HISTSIZE=3000
히스토리와 관련된 변수는 이 외에도 여러 가지가 있습니다. HISTCONTROL 변수는 어떤 명령어를 히스토리에 저장할지 제어합니다. 예를 들어, 공백으로 시작하는 명령어는 히스토리에서 제외하려면 .bashrc 파일에 다음과 같이 추가하세요:
export HISTCONTROL=$HISTCONTROL:ignorespace
이제 명령어 앞에 공백을 두고 입력하면 해당 명령어는 히스토리에 기록되지 않습니다:
$ echo "hello"
$ mysql -u bogus -h badpassword123 mydatabase
$ echo "world"
$ history
1 echo "hello"
2 echo "world"
3 history
중복 항목도 방지할 수 있습니다:
export HISTCONTROL=$HISTCONTROL:ignoredups
이제 같은 명령어를 연속해서 여러 번 입력해도 히스토리에는 한 번만 기록됩니다:
$ ls
$ ls
$ ls
$ history
1 ls
2 history
두 옵션을 모두 사용하고 싶다면 ignoreboth를 사용하면 됩니다:
export HISTCONTROL=$HISTCONTROL:ignoreboth
히스토리에서 특정 명령어 삭제하기
실수로 민감한 정보를 셸에 입력했거나, 문제 해결 과정을 더 정확하게 담기 위해 히스토리를 정리하고 싶은 경우가 있을 수 있습니다. Bash 히스토리에서 특정 명령어를 삭제하려면 -d 옵션과 함께 삭제하려는 항목의 줄 번호를 지정하면 됩니다:
$ echo "foo"
foo
$ echo "bar"
bar
$ history | tail
535 echo "foo"
536 echo "bar"
537 history | tail
$ history -d 536
$ history | tail
535 echo "foo"
536 history | tail
537 history -d 536
538 history | tail
HISTCONTROL 환경 변수에 ignorespace가 설정되어 있다면, 명령어 앞에 공백을 넣어 히스토리에 기록되지 않도록 할 수도 있습니다:
$ history | tail
535 echo "foo"
536 echo "bar"
$ history -d 536
$ history | tail
535 echo "foo"
-c 옵션을 사용하면 세션 전체 히스토리를 한 번에 비울 수 있습니다:
$ history -c
$ history
$
히스토리 활용 교훈
히스토리 조작은 생각보다 위험하지 않습니다. 특히 목적을 가지고 히스토리를 관리한다면 더욱 그렇습니다. 예를 들어 복잡한 문제를 문서화할 때는 세션 히스토리를 활용해 명령어를 기록하는 것이 좋습니다. 명령어를 히스토리에 남기면서 실제로 실행하기 때문에 자연스럽게 과정을 검증할 수 있기 때문입니다. 실제로 실행하지 않고 문서만 작성하면 사소한 단계를 놓치거나 세부 사항을 잘못 기록하기 쉽습니다.
필요에 따라 세션 히스토리를 적극적으로 활용하고, 히스토리를 다루는 강력한 권한을 현명하게 사용하세요. 즐거운 히스토리 해킹 되시길 바랍니다!