为什么此命令会创建一个很大的文件?


19

我今天正在尝试一些附加操作,并且出于好奇,运行了此命令(其中file1.txt为非空,而file2.txt为空):

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

当我看到它花了一段时间后,按Ctrl+ C结束它。到那时,file1.txt的大小为数百MB。

切换文件名不会产生相同的效果。仅当文件按此顺序排列时,才会发生无限重定向。到底是什么原因造成的?

Answers:


24

您不能cat以这种方式使用多种标准,因此最后的重定向优先于此:

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

等效于:

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

考虑到作为目的地的源文件也会无限期地增长,因此显然这很快就填满了文件系统file1.txt

大多数现代cat实现应检测递归并中止:

Solaris猫:

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
你使我旋转,但回答了我的问题!
马特

7
当我在Google+上询问此问题时(没有得到答案),它自动用#Cat#Caturday
Matt

3

我无法在Bash shell中重现它:

# 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)“所以,别再邪恶了”

@Gilles-我只是重新阅读并注意到它,是否应该看到与众不同的东西,但仍然会收到错误消息?还是您只是说b / c我回答中的例子是错误的?我确定了答案顺便说一句。
slm

@吉尔斯-那是你的不赞成,不是吗?它仅是针对特定内容还是缺少答案的价值?
slm

1
不知道为什么你的答案被否决,+1回答,这是我没有做我自己之前经历...
jlliagre

+1; 感谢您的实验!我开始cat更好地了解重定向和行为。
马特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.