처리된 값으로 파일을 덮어쓸 수 없는 이유는 무엇입니까?

처리된 값으로 파일을 덮어쓸 수 없는 이유는 무엇입니까?

이것이 질문은 내가 잘 이해하고 있는지 잘 모르겠다는 생각을 촉발시켰습니다. cat myfile | grep -v mypattern > myfile파일 핸들 설정 방식으로 인해 파이프 사용이 불가능하거나 올바르지 않다는 것을 알고 있습니다 . 그런데 왜 단순히 cat myfile | grep -v mypattern| tee myfile>/dev/null파일의 내부 수정을 사용할 수 없습니까 ? 간단한 실패 사례가 있나요?

구체적으로 손상을 유발합니까, 아니면 제자리에서 편집하지 않고 덮어쓰는 것에 더 가깝습니까?

질문 업데이트, 답변에 다음 사항도 고려해주시면 감사하겠습니다.

사용하는데 문제가 있나요 cat myfile | grep -v mypattern| bash -c 'rm myfile; cat > myfile'?

답변1

단순히 처리된 값으로 파일을 덮어쓰지 않습니다.

문제는 어느 것이 먼저 실행될지 보장할 수 없다는 것입니다. 따라서 파일이 읽기용으로 열려 있다고 확신할 때까지 파일 링크 해제 및 쓰기를 연기해야 ​​합니다.

이렇게 하면 파일을 쓰기 전에 RAM에 버퍼링됩니다.

cat foo | perl -e 'undef $/; @out=<>; open WRT,">",shift; print WRT @out' foo

장점: foo의 권한을 유지합니다. 중단되더라도 원본 foo.txt 파일은 손실되지 않습니다.

단점: foo는 RAM에 맞아야 합니다.

그러면 파일을 읽고, 삭제하고, cat삭제할 수 있습니다. 동시에 파일이 사라질 때까지 기다렸다가 사라지면 처리합니다 cat.

(rm foo; cat) < foo | (perl -e 'while(-e "foo"){}'; cat >foo)

장점: 짧다. RAM보다 큰 파일에 적합합니다.

단점: foo는 시작되자마자 사라집니다.

(mv foo bar; cat) < foo | (perl -e 'while(-e "foo"){}'; cat >foo && rm bar)

장점: RAM보다 큰 파일에 적합합니다. 실패하면 foo는 백업으로 bar에 남게 됩니다.

답변2

tee명령이 파일을 덮어쓰고 파일을 더 짧게 만들고(아마도) cat파일의 데이터를 읽는 명령의 기능을 제거하기 때문에 간단히 이 작업을 수행할 수 없습니다 .

tee오프닝과 같은 프로그램이 있는지 확인할 수 있다면새로운문서,그리고셸에서 cat해당 복사본이 먼저 열리도록 하면 이전(실제로 삭제된) 파일에서 새 파일로 복사할 수 있습니다. 그러나 가정은 많고 보장은 거의 없습니다.

cat예를 들어, 이 작업이 먼저 시작되고 tee나중에(데이터를 캡처해야 할 때) 시작될 것이라고 생각할 수 있습니다 . 하지만껍데기둘 다 시작하고 시작하기 tee전에 입력을 기다리지 않으면 cat쓰기가 실패할 수 있습니다(기다리는 사람이 없고 해당 바이트가 갈 곳이 없기 때문입니다). 를 기다리는 것보다 프로세스가 를 기다리게 하는 것이 read더 쉽습니다 write.

관련 정보