이 글에서는 bash history 기록을 전체 삭제할 수 있는 -c 와, 특정한 라인을 삭제할 수 있는 -d 옵션을 알아보고자 합니다. zsh history에서 -d 옵션은 지원되지 않으니, 주의가 필요합니다.
history -c 옵션
먼저, -c 옵션은 아래와 같습니다.
- 명령어 기록 목록을 모두 삭제합니다.
여기서 명령어 기록 목록은 무엇일까요? 메모리에 저장되어 있는 것을 의미합니다.
기록 파일에 exit 명령어를 친 기록만 있습니다.
그런데, history를 쳤을 때에는 다르게 나옵니다. 왜 그렇다고 했나요? sync가 맞지 않아서 그렇습니다.
-c 옵션을 추가해서, 히스토리를 지워 봅시다. 그리고 다시 history를 보면, 아무것도 출력이 되지 않음을 볼 수 있어요. 그런데 기록 파일에는 남아 있어요.
이는 메모리에 전체 기록을 지우기만 할 뿐, 파일에 반영하지 않기 때문이에요. 파일에까지 반영하기 위해서는 bash 명령어 기록을 어떻게 파일에 반영하는 방법 [link] 을 보시면 되겠습니다.
특정한 줄을 삭제하는 -d 옵션
이제 -d 옵션을 보겠습니다.
- -d offset
- offset 위치에 있는 기록 목록을 삭제합니다.
- 만약 offset이 음수라면 맨 끝에서부터 거꾸로 셉니다.
이게 전부입니다. 당연하게도, 기록 목록만 변경하기 때문에, 결과가 파일에 반영되지 않습니다. 이 점을 조심해야 합니다. 예를 들어, offset이 3이라면, 기록 목록 중 3번째를 삭제합니다. offset이 5인 경우에는 기록 목록 중 5번째 것을 삭제합니다. 이것도 예시를 보겠습니다.
먼저, 메모리 상에 echo 1, … , echo 5, history 순으로 명령어를 입력한 기록이 있습니다. 여기서 5번째로 입력한 echo 5를 삭제하고 싶습니다. 그러면 어떻게 입력하면 될까요?
history -d 5를 입력하면 됩니다. 이는, 기록 목록 중 5번째를 삭제한다는 의미입니다. 삭제 후, 다시 목록을 보면, echo 5가 사라진 것을 볼 수 있습니다. 만약에 음수라면 어떻게 될까요?
history를 입력했을 때, echo 1, … , echo 6, history 순으로 저장되어 있었습니다. offset을 -3으로 주었습니다. 이 경우, 어떤 것이 지워질까요? 얼핏 보아서는 끝에서부터 3번쨰인 echo 5가 지워질 거 같습니다. 결과를 볼까요?
실제로는 echo 5가 아니라 echo 6이 지워졌어요. 왜 그럴까요?
이는 history -d -3이 메모리에 추가된 후에 offset을 검사하기 때문입니다. 해당 명령이 추가된 후에는, 끝에서 1번째는 history -d 3이 됩니다. 따라서, 끝에서 3번째는 echo 5가 아닌 echo 6이 됩니다. 이를 이용하면, bash history에서 내가 작성한 명령어를 메모리에 저장하지 않게 하는 방법이 있습니다.
history -d -1 명령어와 내가 작성할 명령어를 && 로 연결해 주면 됩니다. export A=1은 제가 작성한 명령어입니다.
history -d -1과 export A=1이 &&로 연결된 명령어가 memory에 들어갈 텐데요. 이 경우, 끝에서 1번째가, 해당 명령어를 가리키게 됩니다. 따라서, offset으로 -1을 주면 됩니다.
bash history 여러 줄 삭제
여러 줄을 삭제하기 위해서는 어떻게 하면 될까요? range가 있는 경우 1-3과 같이 dash를 붙이면 됩니다. 그런데 2번째 줄과 5번째 줄을 삭제해야 하는 경우에는 어떻게 해야 할까요? 이 경우, 범위가 여러 개입니다. 그런가요? 그러면, 2개의 명령어를 && 로 연결을 하는 방법이 있습니다. 범위가 모두 valid 하다면.
예를 들어 2, 5번째 줄을 삭제해야 한다고 해 봅시다. 이 경우, history -d 5, history -d 2 순서대로 실행시키면 됩니다. 왜냐하면, a && b는 a 명령어가 실행되고 난 후, b 명령어가 실행되는 것이기 때문입니다.
echo 2, echo 5가 삭제되었음을 볼 수 있습니다.