오늘 몇 가지 추가 작업을 시도하고 있었는데 호기심에 이것을 실행했습니다.파일 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
빈 파일을 생성합니다.