이 명령이 왜 큰 파일을 생성합니까? 비어 있지

오늘 추가 작업을 실험하고 있었고 호기심에서 이것을 실행했습니다 ( file1.txt 는 비어 있지 않고 file2.txt 는 비어 있습니다).

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

시간이 오래 걸리는 것을 보았을 때 Ctrl+ C를 눌러 종료했습니다. 그때까지 file1.txt의 크기는 수백 MB였습니다.

파일 이름을 전환해도 같은 효과가 없습니다. 파일이이 순서에있을 때만 무한 리디렉션이 수행됩니다. 정확히 무슨 일이 일어나고 있습니까?



답변

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

쓸모없는 고양이를 사용하는 것이 좋습니다 …


답변

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

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

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

1 개의 파일은 길이가 0 인 것으로 생성되지만 위의 메시지가 나타납니다.

$ 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의 답변을 바탕으로 왜 2 파일을 얻는 지 잘 모르겠습니다. cat구현에 따라 다를 수 있습니다 .

편집 # 1

@jlliagre는 자신의 답변을 업데이트하여이 코드를 동등한 것으로 표시했습니다.

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

그래서 나는 왜 내가 빈을 얻는 지 안다 file2.txt. 이 표기법은 합법적입니다.

>> file2.txt

그리고 빈 파일을 만듭니다.