为什么这个命令会创建一个非常大的文件?

Mat*_*att 19 io-redirection cat

我今天尝试了一些附加操作,出于好奇,我运行了这个(其中file1.txt非空,file2.txt为空):

$ cat file1.txt >> file2.txt >> file1.txt
Run Code Online (Sandbox Code Playgroud)

当我看到它需要一段时间时,我按Ctrl+C结束它。到那时,file1.txt 的大小已达数百 MB。

切换文件名不会产生相同的效果;只有当文件按此顺序时,才会发生无限重定向。究竟是怎么回事导致了这种情况?

jll*_*gre 24

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

cat file1.txt >> file2.txt >> file1.txt
Run Code Online (Sandbox Code Playgroud)

相当于:

>> file2.txt ; cat file1.txt >> file1.txt
Run Code Online (Sandbox Code Playgroud)

考虑到作为目标的源文件也无限期地增长,这显然会迅速填满文件系统,前提file1.txt是它足够大而不能立即读取。

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

太阳猫:

cat: input/output files 'file1.txt' identical
Run Code Online (Sandbox Code Playgroud)

咕噜猫:

cat: file1.txt: input file is output file
Run Code Online (Sandbox Code Playgroud)

无论如何,他们都可以被愚弄,例如:

cat < file1.txt | cat | cat  >> file2.txt >> file1.txt
Run Code Online (Sandbox Code Playgroud)

对猫的一个很好的不那么无用的使用......

  • 这是很多猫,喵。 (19认同)
  • 当我在 Google+ 上询问这个问题(没有得到答案)时,它会自动用**#Cat** 和 **#Caturday** 标记我的帖子 (7认同)
  • 你让我头晕目眩,但你回答了我的问题! (2认同)