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

Rab*_*bit 6 io-redirection input files cat output

具体地,在的情况下cat x y > ycat x >> x其中x和y是文件。

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

Mic*_*mer 7

cat x y > y将与cp x y(因为ycat开始时间之前会被截断)相同,然后是cat y >> y.

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

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

在 GNUcat中生成该消息的测试是:

  1. 输出 (fd 0) 是一个普通文件;和
  2. 输出 fd 和被检查的输入文件的设备(st_dev字段)和索引节点(st_ino字段)是相同的;和
  3. 输入文件中的偏移量小于文件的大小(所以它不是空的;我想不出此时偏移量不会为零的情况,但大概有一个)。

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

某些版本的cat命令不进行此检查,您可以使这些事情发生。我可以想象一个系统,他们确实进行了检查,但它无法判断它们也是同一个文件,尽管我无法直接告诉你一个。在任何一种情况下,它都可能以糟糕的方式结束。如果cat实现只对整个内存映射文件进行一次写入,那么到目前为止,您可能只是将文件翻倍,而不是循环,但这只是一种不太严重的情况。

  • `cd /tmp ; 回声 1 > a ; 回声 2 > b ; cat ab > b` -> `cat: b: input file is output file` 对我有用。代码也一直存在。 (2认同)