为什么输入文件不能成为输出文件?

为什么输入文件不能成为输出文件?

特别是在x 和 y 是文件的情况下cat x y > ycat x >> x

如果我没有收到“输入文件是输出文件”错误,会发生什么情况?基本上,为什么我不允许运行这些命令?

答案1

cat x y > ycp x y将与(因为y在开始时间之前被截断)相同cat,后跟cat y >> y.

cat x >> x这将是一个无限循环,直到磁盘已满或达到文件系统的文件大小限制(因为它不断添加到文件末尾,然后读回以再次添加)。

请注意,这个“错误”并不意味着cat没有执行任何操作 - 它只是一个通知,该特定文件被跳过(在GNU中cat,至少)。你被“允许”运行它,它只是可能没有做你想要的事情,它让你知道。

GNU 中生成该消息的测试cat是:

  1. 输出 (fd 0) 为常规文件;和
  2. 对于输出 fd 和正在检查的输入文件来说,设备(st_dev字段)和索引节点(字段)是相同的;st_ino
  3. 输入文件中的偏移量小于文件的大小(因此它不是空的;我无法想到此时偏移量不为零的情况,但大概有一个)。

如果所有这些都适用,它将打印诊断信息并移至下一个输入文件。

该命令的某些版本cat不会进行此检查,您可以使这些事情发生。我可以想象一个系统,他们确实进行了检查,但也无法判断它们是同一个文件,尽管我无法立即告诉您其中一个。无论哪种情况,结局都可能很糟糕。如果cat实现只对整个内存映射文件进行一次写入,那么您最终可能会得到文件加倍的结果,而不是循环,但这只是一种不太严重的情况。

相关内容