이 명령이 매우 큰 파일을 생성하는 이유는 무엇입니까?

이 명령이 매우 큰 파일을 생성하는 이유는 무엇입니까?

오늘 몇 가지 추가 작업을 시도하고 있었는데 호기심에 이것을 실행했습니다.파일 1.txt비어 있지 않으며파일 2.txt비었다):

$ cat file1.txt >> file2.txt >> file1.txt

시간이 좀 걸릴 것 같으면 Ctrl+를 눌러 C종료합니다. 언제,파일 1.txt크기는 수백MB입니다.

파일 이름을 전환해도 동일한 효과는 없습니다. 파일이 이 순서로 되어 있는 경우에만 무한 리디렉션이 발생합니다. 이 상황의 원인은 정확히 무엇입니까?

답변1

이 방법으로는 여러 기준을 사용할 수 없으며 cat마지막 리디렉션이 우선 적용됩니다.

cat file1.txt >> file2.txt >> file1.txt

다음과 동일:

>> file2.txt ; cat file1.txt >> file1.txt

대상이 되는 소스 파일도 무한히 커진다는 점을 고려하면, file1.txt즉시 읽을 수 있을 만큼 큰 한, 이는 분명히 파일 시스템을 매우 빠르게 가득 채울 것입니다.

대부분의 최신 cat구현에서는 재귀를 감지하고 중단해야 합니다.

솔라리스 고양이:

cat: input/output files 'file1.txt' identical

누우 고양이:

cat: file1.txt: input file is output file

어쨌든 그들은 다음과 같은 것에 속을 수 있습니다.

cat < file1.txt | cat | cat  >> file2.txt >> file1.txt

고양이를 잘 활용하지만 쓸모없지는 않습니다…

답변2

Bash 셸에서는 이것을 재현할 수 없습니다.

# non-empty file1
$ echo 1 > file1.txt

$ cat file1.txt >> file2.txt >> file1.txt 
cat: file1.txt: input file is output file

길이가 0인 파일 1개가 생성되었지만 위의 메시지가 표시됩니다.

$ ls -l
total 4
-rw-rw-r-- 1 saml saml   2 Sep 10 19:35 file1.txt
-rw-rw-r-- 1 saml saml   0 Sep 10 19:35 file2.txt

@jlliagre의 답변에 따르면 이 두 파일을 받는 이유가 무엇인지 잘 모르겠습니다. 이는 cat구현 에 따라 달라질 수 있습니다 .

편집 #1

@jlliagre는 그가 말한 내용이 동등한 코드임을 보여주기 위해 답변을 업데이트했습니다.

>> file2.txt ; cat file1.txt >> file1.txt

이제 내가 왜 공허해지는지 알겠습니다 file2.txt. 이 표기법은 합법적입니다.

>> file2.txt

빈 파일을 생성합니다.

관련 정보