猫重定向


11

假设abc当前目录中存在一个名为的文件,并且其中包含一些文本。执行命令时:

cat abc > abc

为什么文件的内容abc消失了?
为什么命令删除其中的文本,文件变成空文件?



10
一个激光指示器是一个非常有效的工具猫重定向。 </ pun>
WBT

我的猫对重定向的响应非常差...
Ex Umbris '16

为避免此问题,我使用了一个称为dog的小cat abc | dog abc
shellscript

如果您不介意屏幕上的输出,则另一个选择是使用tee
安德里亚·拉扎罗托

Answers:


27

因为顺序是如何完成的。

当您这样做时:

cat abc > abc

>是输出重定向运算符,当外壳程序看到此内容时,它将使用O_TRUNC带有open(2)ie的标志以截断模式打开文件open("abc", O_TRUNC),因此文件中的所有内容都将消失。请注意,此重定向首先在cat命令运行之前由外壳完成。

因此,当命令 cat abc执行时,文件abc已被截断,因此cat将发现文件为空。


1
那猫abc >> abc呢?那会发生什么呢?
Tulsi Kanodia

2
@TulsiKanodia-导致无限循环。每次猫读一行时,它都会在行前追加另一行。
user3490

3
这被检测到并被阻止。而是将文本cat: filename: input file is output filefilename您选择的文件名在哪里)打印在旧的标准输出上。
UTF-8


5

添加到@heemayl的答案中,如果您希望代码更清楚地了解事情发生的顺序,则可以将任何重定向放在命令的开头:

> abc cat abc
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.