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

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

예를 들어, 다음은 내가 사용하는 명령입니다.

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

관련 정보