이것이 질문은 내가 잘 이해하고 있는지 잘 모르겠다는 생각을 촉발시켰습니다. 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
.