개요

sponge는 [[/cmd/moreutils]] 패키지에 포함된 명령이다.

sponge : > 와 비슷하지만 작동 방식이 다르다

> 리다이렉션의 작동방식을 잘 모른다면 다음과 같은 실수를 할 수 있다.

 # file.txt 를 읽고 그 내용을 file.txt 에 덮어쓴다.
cat file.txt > file.txt

 # file.txt 의 내용을 정렬하고 중복을 제거한 다음 file.txt 를 업데이트한다.
sort file.txt | uniq > file.txt

위와 같이 하면 의도(논리적 순서)와는 달리 file.txt 파일이 비어있게 되는데, 명령어 파이프라인에서 >는 마지막에 실행되지 않고, 초기화될 때 실행되기 때문이다.

따라서 초기화 단계에서 file.txt는 비워지게 되므로 명령어 파이프라인은 의도대로 동작하지 않게 된다.

sponge는 이런 경우에 논리적인 순서로 파일이 읽히고 업데이트되도록 해준다.

sponge의 실제 동작은 임시 파일을 만들고, 작업이 끝나면 rename을 해주는 방식이다.1

Examples

 # 의도와는 달리 file.txt 파일이 비워진다
cat file.txt | sort -R > file.txt
  • 위의 명령은 file.txt 파일을 읽고, 그 내용을 랜덤 정렬한 다음 file.txt 파일에 덮어쓸 의도로 작성한 것이다.
  • 그러나 의도와는 달리 결과적으로 file.txt 파일은 비워지게 된다.
 # file.txt 내용이 랜덤으로 뒤섞인다
cat file.txt | sort -R | sponge file.txt
  • sponge> 대신 사용하면 의도한대로 file.txt 파일 내용이 랜덤으로 뒤섞이게 된다.

주석