본문 바로가기
C.W.K.
Stream
Lesson 02 of 10 · published

출력 리디렉션: >와 >>

~10 min · redirect, stdout, append

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

화면으로 갈 출력을 파일에 보내기

cmd > file은 stdout을 file에 쓰면서 기존 내용을 대체해. cmd >> file은 기존 내용 뒤에 덧붙여. 프로그램이 stderr를 따로 쓰지 않는다면 화면에는 아무것도 보이지 않아.

덮어쓰기와 이어 쓰기

  • >: 명령이 실행되기 전에 파일 길이를 0으로 만든 뒤 새로 써.
  • >>: 기존 내용을 보존하고 파일 끝에 덧붙여.
printf 'first\n' > example.txt
printf 'second\n' >> example.txt
cat example.txt

실패한 명령 때문에 기존 파일이 비워지는 것을 막고 싶다면 set -o noclobber를 켜. 그 상태에서 의도적으로 덮어쓸 때만 >| file을 사용해.

파일을 표준 입력으로 연결하기

cmd < file은 파일 내용을 cmd의 stdin으로 보내. wc -l < lines.txtcat을 따로 실행하지 않고 줄 수를 세고, sort < data.txttr a-z A-Z < input.txt도 같은 구조야.

여러 리디렉션 조합하기

cmd < in.txt > out.txt 2> err.txt처럼 입력과 두 출력을 함께 연결할 수 있어. cmd > out.txt 2>&1은 stderr를 out.txt로 보내지만, cmd 2>&1 > out.txt은 stderr를 원래 화면에 남겨. 같은 파일 디스크립터를 다시 연결할 때는 왼쪽부터 적용되는 순서가 결과를 바꿔.

명령보다 먼저 파일이 비워질 수 있어

셸은 명령 본문을 시작하기 전에 리디렉션을 준비해. 명령이 없거나 즉시 실패해도 기존 파일은 이미 비어 있을 수 있어. 중요한 결과는 임시 파일에 완전히 쓴 뒤 성공했을 때만 최종 이름으로 바꾸는 편이 안전해.

이어 쓰기는 동시성 계약이 아니야

>>가 파일 끝에 쓰더라도 여러 프로세스의 긴 레코드가 줄 단위로 온전히 유지된다고 가정하면 안 돼. 구조화 로그와 공유 상태는 동시 쓰기를 책임지는 로거나 데이터베이스에 맡겨.

Code

뒤에 덧붙이기와 덮어쓰기·bash
echo 'first'  > log.txt
echo 'second' > log.txt          # 파일을 덮어씀
echo 'third'  >> log.txt         # 파일 뒤에 덧붙임
cat log.txt                      # 출력: second와 third
stdout / stderr 둘 다 한 파일로·bash
# bash와 zsh 모두 리디렉션 순서가 중요
make all > build.log 2>&1
# bash 4 이상의 단축 문법
make all &> build.log
# 두 스트림을 모두 파일 뒤에 덧붙이기
make all >> build.log 2>&1

External links

Exercise

먼저 echo first > log.txtecho second >> log.txt의 차이를 확인해. 다음에는 별도 셸에서 noclobber를 켜고 기존 파일로의 >가 거부되는지 봐. 각 명령은 한 문장 안의 semicolon 사슬로 묶지 말고 상태와 파일 내용을 단계마다 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.