Linux / 명령어 / history - 명령어 실행 기록 확인
Bash의 history 명령어는 현재 셸이 기억하는 이전 명령을 번호와 함께 보여 주고, 필요한 항목을 검색·재실행·삭제하거나 기록 파일과 동기화할 때 사용합니다. 최근 명령 몇 개만 보려면 history 20, 특정 문자열을 찾으려면 history | grep '검색어', 입력 중 빠르게 찾으려면 Ctrl+r을 사용할 수 있습니다.
history는 Bash의 내장 명령어입니다. 이 글의 설명은 Bash를 기준으로 하며, Zsh·Fish 같은 다른 셸은 기록 파일과 설정 방법이 다를 수 있습니다.
history 명령어란?
Bash는 대화형 셸에서 사용자가 입력한 명령을 메모리의 기록 목록에 저장합니다. history는 이 목록을 확인하고 수정하며, HISTFILE이 가리키는 기록 파일을 읽거나 쓸 수 있는 명령어입니다.
기본 기록 파일은 일반적으로 ~/.bash_history입니다. Bash가 시작될 때 이 파일을 읽어 메모리의 기록 목록을 만들고, 셸이 정상적으로 종료될 때 현재 기록을 파일에 저장합니다. 자세한 동작은 GNU Bash의 History Facilities 문서에서 확인할 수 있습니다.
명령 기록은 편의를 위한 기능이지 보안 감사 로그는 아닙니다. 사용자가 항목을 지울 수 있고, 셸이 비정상적으로 종료되거나 기록 설정이 꺼져 있으면 저장되지 않을 수 있습니다.
기본 사용법
옵션 없이 실행하면 현재 Bash 세션의 기록을 번호와 함께 출력합니다.
history
출력 예시는 다음과 같습니다.
241 apt update 242 systemctl status ssh 243 journalctl -u ssh 244 history
마지막 20개처럼 최근 기록 일부만 확인하려면 숫자를 지정합니다.
history 20
| 형식 | 기능 | 주의할 점 |
|---|---|---|
history n |
최근 n개 항목 출력 | 현재 셸의 메모리 목록을 기준으로 합니다. |
history -c |
현재 기록 목록 전체 삭제 | 다른 셸 세션과 파일의 상태는 별도로 고려해야 합니다. |
history -d 번호 |
지정한 항목 삭제 | 삭제할 번호가 맞는지 먼저 확인합니다. |
history -a |
이번 세션의 새 항목을 파일 끝에 추가 | HISTFILE이 설정되어 있어야 합니다. |
history -n |
파일의 새 항목을 현재 목록에 추가 | 다른 세션에서 추가한 기록을 가져올 때 유용합니다. |
history -r |
기록 파일 전체를 현재 목록에 추가 | 이미 있는 항목과 중복될 수 있습니다. |
history -w |
현재 목록으로 기록 파일 덮어쓰기 | 여러 터미널이 열려 있으면 다른 세션의 기록에 영향을 줄 수 있습니다. |
history -p 표현식 |
기록 확장 결과만 출력 | 실행 전에 ! 확장 결과를 확인할 때 유용합니다. |
history -s 명령 |
명령을 실행하지 않고 기록에 추가 | 현재 기록 목록의 마지막 항목으로 들어갑니다. |
각 옵션의 정확한 정의와 반환 상태는 GNU Bash의 History Builtins 문서를 참고할 수 있습니다.
이전 명령 검색하기
grep으로 목록 필터링하기
기록에 특정 문자열이 포함된 행만 보고 싶다면 grep과 파이프를 함께 사용합니다.
history | grep 'systemctl'
대소문자를 구분하지 않으려면 grep -i를 사용합니다.
history | grep -i 'nginx'
이 방법은 결과를 확인하기에는 편리하지만, 출력에 포함된 현재 검색 명령까지 결과에 나타날 수 있습니다.
Ctrl+r로 입력 중 검색하기
Bash가 기본적인 Emacs 편집 모드를 사용한다면 Ctrl+r로 이전 명령을 역방향 증분 검색할 수 있습니다. 검색할 문자를 입력할 때마다 가장 최근의 일치 항목이 표시되고, Ctrl+r을 다시 누르면 그보다 오래된 다음 결과로 이동합니다.
Enter: 표시된 명령을 실행합니다.- 왼쪽·오른쪽 방향키: 검색을 끝내고 명령을 편집합니다.
Ctrl+g: 검색을 취소하고 원래 입력으로 돌아갑니다.
바로 실행하기 전에 방향키로 검색을 종료하여 명령과 인수를 검토하는 습관이 안전합니다. 검색 방식은 GNU Readline의 명령 기록 검색 문서에 설명되어 있습니다.
이전 명령 다시 실행하기
느낌표를 이용한 기록 확장
대화형 Bash에서는 !로 시작하는 기록 확장(history expansion)을 사용해 이전 명령을 불러올 수 있습니다.
| 표현식 | 의미 | 예시 |
|---|---|---|
!! |
직전 명령 | sudo !!는 직전 명령 앞에 sudo를 붙입니다. |
!125 |
기록 번호 125의 명령 | 번호는 history 출력에서 확인합니다. |
!-3 |
현재 위치에서 세 번째 이전 명령 | 최근 명령을 상대적인 위치로 선택합니다. |
!ssh |
ssh로 시작하는 가장 최근 명령 | 같은 접두어의 명령이 많으면 예상과 다른 항목이 선택될 수 있습니다. |
!?nginx? |
nginx가 포함된 가장 최근 명령 | 명령 중간의 문자열로 검색합니다. |
^이전^새값^ |
직전 명령의 첫 일치 문자열을 바꿔 실행 | 짧은 오타를 고쳐 다시 실행할 때 사용합니다. |
기록 확장은 기본적으로 대화형 Bash에서 활성화되며, 비대화형 셸 스크립트에서는 기본적으로 수행되지 않습니다. 자세한 문법은 GNU Bash의 History Expansion 문서에서 확인할 수 있습니다.
실행 전에 확장 결과 확인하기
!번호와 !문자열은 찾은 명령을 바로 실행할 수 있으므로 삭제·권한 변경·시스템 종료 명령이 기록에 있다면 특히 주의해야 합니다. history -p에 표현식을 따옴표로 감싸 전달하면 실행하지 않고 확장 결과만 확인할 수 있습니다.
history -p '!!' history -p '!ssh'
Readline을 사용하는 Bash에서는 아래 옵션을 설정하면 기록 확장 결과를 즉시 실행하지 않고 편집 버퍼에 먼저 표시할 수 있습니다.
shopt -s histverify
번호가 바뀌기 쉬운 여러 터미널 환경에서는 Ctrl+r로 찾아 내용을 확인한 뒤 실행하는 방법이 더 안전한 경우가 많습니다.
명령 기록 삭제하기
특정 항목 삭제
먼저 history로 번호를 확인한 다음 -d 옵션으로 해당 항목을 메모리의 기록 목록에서 삭제합니다.
history -d 125
현재 Bash가 범위 삭제를 지원한다면 시작과 끝 번호를 지정할 수도 있습니다.
history -d 120-125
삭제 결과를 현재 기록 파일에 반영하려면 목록을 확인한 뒤 history -w를 실행할 수 있습니다. 다만 다른 터미널 세션이 나중에 종료되면서 이전 기록을 다시 파일에 쓸 수 있으므로 여러 세션이 열려 있는지 확인해야 합니다.
현재 목록 전체 삭제
-c 옵션은 현재 셸의 메모리에 있는 기록 목록을 모두 지웁니다.
history -c
기록 파일까지 현재 목록으로 갱신하려면 history -w의 동작을 이해한 뒤 사용해야 합니다. 기록 삭제는 셸 기록만 대상으로 하며 시스템 로그, 감사 로그, 백업이나 다른 터미널의 기록까지 제거하지 않습니다.
기록 파일과 여러 터미널 세션
Bash는 실행 중인 각 셸마다 별도의 메모리 기록 목록을 가집니다. 기본 동작에서는 다른 터미널에서 방금 실행한 명령이 현재 터미널의 history에 즉시 나타나지 않을 수 있습니다.
| 명령 | 기록 파일과 현재 세션 사이의 동작 |
|---|---|
history -a |
현재 세션에서 아직 파일에 저장하지 않은 새 기록을 파일 끝에 추가합니다. |
history -n |
기록 파일에서 현재 세션이 아직 읽지 않은 새 행을 메모리 목록에 추가합니다. |
history -r |
기록 파일의 모든 내용을 현재 메모리 목록 뒤에 추가합니다. |
history -w |
현재 메모리 목록 전체로 기록 파일을 덮어씁니다. |
다른 터미널의 새 기록을 가져오려면 먼저 해당 터미널에서 history -a로 파일에 추가하고, 현재 터미널에서 history -n으로 읽습니다.
history -a history -n
셸이 종료될 때 기록 파일을 덮어쓰지 않고 새 항목을 추가하도록 하려면 histappend 옵션을 사용할 수 있습니다.
shopt -s histappend
이 설정을 계속 사용하려면 사용자의 ~/.bashrc에 추가합니다. 여러 터미널에서 매 프롬프트마다 자동 동기화하도록 PROMPT_COMMAND를 설정하는 방법도 있지만, 기존 설정이나 프로그램이 이 변수를 사용하고 있을 수 있으므로 현재 값을 확인하지 않고 덮어쓰면 안 됩니다.
기록 관련 환경 변수 설정
| 변수 | 역할 |
|---|---|
HISTFILE |
기록을 저장할 파일 경로입니다. 일반적인 기본값은 ~/.bash_history입니다. |
HISTSIZE |
현재 셸의 메모리 기록 목록에 유지할 최대 명령 수입니다. |
HISTFILESIZE |
기록 파일에 유지할 최대 크기를 행 단위로 제한합니다. |
HISTCONTROL |
공백으로 시작하는 명령이나 연속 중복 명령을 기록하지 않는 등의 저장 규칙을 설정합니다. |
HISTIGNORE |
기록에서 제외할 명령 패턴을 콜론으로 구분하여 지정합니다. |
HISTTIMEFORMAT |
history 출력에 표시할 날짜와 시간 형식을 지정합니다. |
예를 들어 다음 설정은 메모리에 5,000개, 기록 파일에 10,000개 수준의 기록을 유지하고 공백 시작 명령과 중복 명령을 줄이며 날짜와 시간을 표시합니다.
HISTSIZE=5000 HISTFILESIZE=10000 HISTCONTROL=ignoreboth:erasedups HISTTIMEFORMAT='%F %T ' shopt -s histappend
계속 적용하려면 위 설정을 ~/.bashrc에 추가한 뒤 새 Bash를 시작하거나 설정 파일을 다시 읽습니다.
source ~/.bashrc
HISTCONTROL=ignoreboth는 ignorespace와 ignoredups를 함께 적용합니다. erasedups는 새 명령과 같은 이전 항목을 기록 목록에서 제거합니다. 변수별 세부 규칙은 GNU Bash 변수 문서에서 확인할 수 있습니다.
명령 기록과 보안
비밀번호, API 키, 토큰과 개인 키 내용을 명령행 인수로 입력하면 셸 기록뿐 아니라 실행 중인 프로세스 정보나 다른 로그에 노출될 수 있습니다. 민감정보는 명령행에 직접 입력하지 말고 프로그램이 제공하는 표준 입력, 안전한 자격 증명 저장소 또는 접근 권한이 제한된 설정 파일을 사용하는 것이 좋습니다.
HISTCONTROL에 ignorespace가 설정되어 있으면 공백으로 시작한 명령을 기록에서 제외할 수 있습니다. 하지만 설정이 실제로 활성화되어 있는지에 의존해야 하고 다른 로그까지 막아 주지 않으므로, 민감정보 보호 방법으로만 믿어서는 안 됩니다.
printf '%s\n' "$HISTCONTROL" printf '%s\n' "$HISTFILE"
history -d나 history -c로 항목을 지워도 다른 셸 세션, 백업, 감사 로그와 애플리케이션 로그에 같은 정보가 남을 수 있습니다. 자격 증명이 노출되었다면 기록 삭제만 하지 말고 해당 비밀번호나 토큰을 폐기하고 새로 발급해야 합니다.
자주 발생하는 문제
다른 터미널의 최신 명령이 보이지 않습니다
각 Bash 세션은 독립적인 메모리 목록을 사용합니다. 명령을 실행한 터미널에서 history -a를 실행한 뒤, 확인할 터미널에서 history -n을 실행해 보세요. 장기적으로는 histappend와 셸 초기화 설정을 검토할 수 있습니다.
터미널을 닫은 뒤 기록이 사라졌습니다
HISTFILE이 비어 있거나 기록 파일에 쓸 권한이 없는지, HISTSIZE와 HISTFILESIZE가 0으로 설정되지 않았는지 확인합니다. 셸이 강제로 종료되었다면 종료 시점의 기록 저장 과정이 수행되지 않았을 수도 있습니다.
history 번호가 이전과 달라졌습니다
기록 번호는 고정 식별자가 아니라 현재 메모리 목록의 위치입니다. 항목을 삭제하거나 파일을 다시 읽고 다른 세션의 기록을 합치면 번호가 달라질 수 있습니다. 오래된 번호를 기억해서 실행하기보다 검색 후 명령 내용을 확인하는 것이 안전합니다.
Zsh나 Fish에서도 같은 설정을 사용할 수 있나요?
그대로 적용할 수 없습니다. history라는 이름의 기능이 있더라도 기록 파일, 환경 변수와 동기화 방법은 셸마다 다릅니다. 먼저 printf '%s\n' "$SHELL"과 현재 셸의 공식 문서를 확인해야 합니다.
정리
history는 Bash에서 이전 명령을 조회하는 것뿐 아니라 특정 항목 삭제, 기록 파일 읽기·쓰기와 세션 간 동기화에 사용할 수 있습니다. 일상적인 검색에는 history | grep과 Ctrl+r이 편리하고, 기록 확장으로 다시 실행할 때는 먼저 명령 내용을 확인해야 합니다.
기록의 양과 저장 방식을 바꾸려면 HISTSIZE, HISTFILESIZE, HISTCONTROL, HISTTIMEFORMAT과 histappend를 함께 검토하세요. 다른 명령어의 용도는 리눅스 명령어 목록에서 작업별로 찾아볼 수 있습니다.









