"awk ... file | tee file"이 파일을 자르는 이유는 무엇입니까? [복사]

"awk ... file | tee file"이 파일을 자르는 이유는 무엇입니까? [복사]

이 파이프가 파일을 자르는 이유는 무엇입니까?

awk '...' file | tee file

그리고 cat먼저 하는 거죠, 그렇죠?

cat file | awk '...' | tee file

이 파일은 수백 줄의 일반 구성 파일입니다. 나는 tee그것을 사용하지 않는 경향이 있습니다 ( 먼저 설치 sponge해야하기 때문입니다 ).moreutils

답변1

장기적으로 보면 이 동작이 일관성이 없다는 것을 알게 될 것입니다.

문제는 tee어느 시점에 파일이 쓰기 위해 열린다는 것입니다. 그 순간부터 파일이 잘립니다. 어떤 프로그램이 파일을 읽는지는 중요하지 않습니다.

이는 매우 빠르게 발생하며 cat파일이 열리기 전에 읽기가 완료된 것 같습니다. tee그러나 예를 들어 시스템에 과부하가 걸리는 경우 cat시스템이 완성되지 않고 파이프가 cat절단될 수 있습니다.

따라서 읽기 파이프와 동일한 파일에 쓰지 마십시오. 대신 Gnu awk를 사용 -i inplace하거나, 시스템에서 사용할 수 없는 경우 다음을 사용하세요.

cp file file.tmp &&
awk '...' file.tmp | tee file

관련 정보