화면으로 갈 출력을 파일에 보내기
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.txt는 cat을 따로 실행하지 않고 줄 수를 세고, sort < data.txt와 tr 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를 원래 화면에 남겨. 같은 파일 디스크립터를 다시 연결할 때는 왼쪽부터 적용되는 순서가 결과를 바꿔.
명령보다 먼저 파일이 비워질 수 있어
셸은 명령 본문을 시작하기 전에 리디렉션을 준비해. 명령이 없거나 즉시 실패해도 기존 파일은 이미 비어 있을 수 있어. 중요한 결과는 임시 파일에 완전히 쓴 뒤 성공했을 때만 최종 이름으로 바꾸는 편이 안전해.
이어 쓰기는 동시성 계약이 아니야
>>가 파일 끝에 쓰더라도 여러 프로세스의 긴 레코드가 줄 단위로 온전히 유지된다고 가정하면 안 돼. 구조화 로그와 공유 상태는 동시 쓰기를 책임지는 로거나 데이터베이스에 맡겨.