본문으로 바로가기
TaeyoungKim.dev

리눅스 >와 >> 차이: echo로 쓴 파일이 사라지는 이유

리눅스작성 약 3분 읽기TaeyoungKim
LinkedInX

로그에 한 줄을 더 적었는데 어제 적은 내용이 사라졌다. 파일이 삐진 건 아니다. echo "ready" > run.log에서 > 하나가 기존 내용을 바꿨을 수 있다. >>였다면 어떻게 달라졌을까?

리눅스 >와 >>는 무엇을 다르게 할까?

>는 명령의 표준 출력을 파일로 보낸다. 파일이 이미 있으면 기존 내용을 비우고 다시 쓴다. >>도 출력을 파일로 보내지만 기존 내용 끝에 덧붙인다. 파일이 없으면 둘 다 새로 만든다.

기호이미 있는 파일에 쓰면어울리는 상황
>기존 내용을 덮어씀매번 새로 만드는 결과 파일
>>기존 내용 뒤에 추가줄을 차례로 쌓는 기록

이 기호는 echo의 옵션이 아니라 셸의 리다이렉션이다. printf나 다른 명령의 출력을 보낼 때도 같은 차이가 난다.

echo로 같은 파일을 써 보면 무엇이 남을까?

기존 파일을 건드리지 않도록 mktemp로 빈 임시 파일을 하나 만든다. 변수에는 그 파일 경로가 들어간다.

bash
demo_file=$(mktemp)
echo "boot" > "$demo_file"
echo "ready" >> "$demo_file"
cat "$demo_file"
text
boot
ready

>>가 boot 뒤에 ready를 붙였다. 같은 파일에 다시 >를 쓰면 결과가 달라진다.

bash
echo "retry" > "$demo_file"
cat "$demo_file"
text
retry

boot와 ready는 사라지고 retry만 남는다. 두 기호의 차이를 확인하는 데 명령어 열 개를 외울 필요는 없다. 같은 파일을 다시 읽어 보면 된다.

명령이 실패해도 >가 파일을 비울 수 있을까?

그럴 수 있다. 셸이 먼저 출력 파일을 열어 비운 다음 명령을 실행하기 때문이다. 예를 들어 없는 입력 파일을 읽으면서 결과를 기존 파일에 쓰려 하면, 읽기는 실패해도 출력 파일은 이미 비어 있을 수 있다.

bash
echo "keep" > "$demo_file"
cat missing-input-for-demo.txt > "$demo_file"
cat "$demo_file"

두 번째 명령에서 입력 파일이 없다는 오류가 나고, 마지막 cat은 아무것도 보여 주지 않는다. 이 예제는 missing-input-for-demo.txt가 없는 경우다. 중요한 파일에 그대로 시험하지 말고 앞에서 만든 임시 파일로만 확인하자.

여기서 >>로 바꾸면 기존 줄은 남지만, 실패한 명령을 성공으로 만들어 주지는 않는다. 재시도할 때 같은 줄이 중복될 수도 있다. 덮어쓰기를 피하는 것과 결과가 올바른 것은 별개의 문제다.

로그와 결과 파일에는 무엇을 써야 할까?

처음부터 다시 계산하는 보고서라면 >가 의도에 맞을 수 있다. 다만 명령 실패 중에도 기존 파일이 비워질 수 있으므로 중요한 결과는 다른 임시 파일에 만든 뒤 성공을 확인하고 교체해야 한다. 반대로 한 줄씩 쌓는 간단한 기록이라면 >>가 맞지만, 재실행 중복과 파일 크기 증가를 생각해야 한다.

기호를 고르기 전에 '이 파일은 매번 새로 만드는 결과인가, 기존 내용에 이어 쓰는 기록인가?'를 먼저 묻자. 그리고 경로가 헷갈리면 쓰기 전에 pwd와 파일 이름을 확인한다. > 한 글자는 작지만, 엉뚱한 파일을 비우는 데는 충분하다.

핵심 요약

>는 기존 파일을 덮어쓰고 >>는 끝에 추가한다. 둘 다 셸이 처리하며, >는 뒤의 명령이 실패해도 기존 파일을 먼저 비울 수 있다. 중요한 파일은 성공을 확인하기 전까지 직접 덮어쓰지 말자.

작성자

TaeyoungKim

기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

#Linux#리눅스 리다이렉션#echo 명령어#덮어쓰기#파일 내용 추가

함께 읽으면 좋은 글