입력 파일과 출력 파일이 동일하면 정확히 어떻게 되나요?

입력 파일과 출력 파일이 동일하면 정확히 어떻게 되나요?

다음 명령을 실행한다고 가정해 보겠습니다.

tr a-z A-Z < file > file

< file리디렉션에는 및 의 두 가지 유형이 있습니다 > file. 둘 다 tr명령 전에 처리되며 내가 아는 한 여러 리디렉션이 있는 경우 왼쪽에서 오른쪽으로 처리됩니다. 즉, 먼저 오는 것이 < file나중에 오는 것입니다 > file. < file명령이 실행되면 stdin이름이 이라는 파일에서 나온다는 뜻 인가요 file? 그런 다음 해당 부분 > file이 처리됩니다. 이는 출력이 이름이 지정된 파일로 전송된다는 의미입니다 file. 이름이 지정된 파일도 file크기가 0으로 잘립니다. 이제 명령이 마침내 시작되지만( tr예제에서는) 이전 단계에서 입력 파일이 0으로 잘렸으므로 빈 파일만 처리하게 됩니까?

답변1

좋아요. >명령이 시작되기 전에 파일을 자르면 명령에 빈 입력 파일이 표시됩니다. 왼쪽에서 오른쪽으로 리디렉션을 수행하는지는 실제로 중요하지 않습니다(단, 파일이 존재하지 않고 >file <file파일이 먼저 생성되면 오류가 발생한다는 점 제외).

somecommand <file >>file대부분의 경우 명령이 자체 입력을 읽을 때 무한 루프에 직면하게 됩니다. 그러나 짧은 파일의 경우 명령은 내용을 쓰기 전에 입력 끝을 감지할 수 있으며, 이 경우 입력과 출력이 별도의 파일인 것처럼 작동합니다.

somecommand <file 1<>file, 상황은 더 복잡합니다. 명령이 파일을 확장하거나 축소하는지 여부에 따라 자체 입력을 반복할 수도 있고 그렇지 않을 수도 있습니다. 명령이 항상 파일을 축소하는 경우(예: grep줄 번호 매기기나 색상 지정 또는 이와 유사한 항목 없음), 즉 출력의 바이트 N이 항상 입력의 바이트 0..N-1에만 의존하는 경우 두 개의 파일처럼 동작합니다. 다르다. 하지만 이에 의존하는 것은 권장하지 않습니다. 여러 면에서 취약하고 명령이 중간에 중단되면 혼란을 초래할 수 있습니다.

답변2

입력과 출력에 동일한 파일을 사용하면 분명히 문제가 발생할 수 있습니다. 쉘이 이 두 파일을 열면 출력 파일이 잘리기 때문에 문제가 시작됩니다.

출력에 추가되면 디스크가 가득 차거나 최대 파일 크기에 도달할 때까지 무한 반복됩니다.

관련 정보