이 명령이 왜 큰 파일을 생성합니까?


19

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

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

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

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

답변:


24

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

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


19
고양이가 많아요, 야옹
slm

2
당신은 내 머리를 돌렸지 만 내 질문에 대답했습니다!
Matt

7
그리고 Google+에서이 질문에 대한 답변을 얻지 못했을 때 #Cat#Caturday
Matt

3

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

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


file1.txt비어 있지 않은 상태에서 다시 시작 하십시오 .
Gilles 'SO- 악마 그만'

@Gilles-방금 다시 읽고 그것을 알아 차 렸습니다. 다른 것이 보이면 여전히 오류가 발생합니까? 아니면 내 대답의 예가 잘못되었다고 말하는 것입니까? 나는 대답 BTW를 고쳤다.
slm

@Gilles-그건 당신의 공세였습니까? 구체적이거나 답의 가치가없는 것입니까?
slm

1
왜 답이 투표되지 않았는지, 대답하기 전에 경험 한 것에 대해 +1, 내가하지 않은 일을
확신

+1; 실험 해 주셔서 감사합니다! 리디렉션 및 cat동작을 더 잘 이해하기 시작했습니다 .
Matt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.