입력을 파일 자체로 사용하는 명령의 출력을 파일에 저장할 수 없는 이유는 무엇입니까?

입력을 파일 자체로 사용하는 명령의 출력을 파일에 저장할 수 없는 이유는 무엇입니까?

예를 들어, 제가 사용하고 있는 명령은 다음과 같습니다.

tr -d '\n' < newfile.ppm 

결과를 정확히 동일한 파일로 출력하고 싶기 때문에 지금 다음을 수행하고 있습니다.

tr -d '\n' < newfile.ppm > newfile.ppm

이것이 작동하지 않는 이유는 무엇이며 어떻게 작동하게 할 수 있습니까?

답변1

이것은 매우 일반적인 "문제"입니다.

파일에 쓰기 위해 stdout 또는 stderr을 리디렉션하면 쉘은 먼저 파일을 잘라 쓰기 준비를 합니다. 따라서 일어나는 일은 대략 다음과 같습니다.

  1. 쉘이 stdin을 다음으로 설정합니다.newfile.ppm
  2. 쉘이 newfile.ppm길이 0으로 잘립니다.
  3. 쉘이 stdout을 다음으로 설정합니다.newfile.ppm
  4. 쉘이 실행됩니다 tr -d '\n'. 보시다시피 현재 시점에서는 의 내용이 newfile.ppm이미 사라져서 읽을 내용이 없습니다.

이 문제를 해결하려면 대신 다른 파일로 출력하면 됩니다. 나중에 이름을 바꿀 수 있습니다

답변2

그러면 원하는 작업이 수행됩니다.

[stephan@stephan] ~ 
$ echo "meh                                    
" > file
[stephan@stephan] ~ 
$ cat file | tr -d '\n' > file ; cat file 
meh

관련 정보