特别是在x 和 y 是文件的情况下cat x y > y
。cat x >> x
如果我没有收到“输入文件是输出文件”错误,会发生什么情况?基本上,为什么我不允许运行这些命令?
答案1
cat x y > y
cp x y
将与(因为y
在开始时间之前被截断)相同cat
,后跟cat y >> y
.
cat x >> x
这将是一个无限循环,直到磁盘已满或达到文件系统的文件大小限制(因为它不断添加到文件末尾,然后读回以再次添加)。
请注意,这个“错误”并不意味着cat
没有执行任何操作 - 它只是一个通知,该特定文件被跳过(在GNU中cat
,至少)。你被“允许”运行它,它只是可能没有做你想要的事情,它让你知道。
GNU 中生成该消息的测试cat
是:
- 输出 (fd 0) 为常规文件;和
- 对于输出 fd 和正在检查的输入文件来说,设备(
st_dev
字段)和索引节点(字段)是相同的;st_ino
和 - 输入文件中的偏移量小于文件的大小(因此它不是空的;我无法想到此时偏移量不为零的情况,但大概有一个)。
如果所有这些都适用,它将打印诊断信息并移至下一个输入文件。
该命令的某些版本cat
不会进行此检查,您可以使这些事情发生。我可以想象一个系统,他们确实进行了检查,但也无法判断它们是同一个文件,尽管我无法立即告诉您其中一个。无论哪种情况,结局都可能很糟糕。如果cat
实现只对整个内存映射文件进行一次写入,那么您最终可能会得到文件加倍的结果,而不是循环,但这只是一种不太严重的情况。