理解Unix中的I / O重定向

时间:2018-04-15 14:50:44

标签: linux shell unix io-redirection

我不确定我是否完全理解Unix中的重定向。 我正在玩这个命令“cat hello.txt world.txt> world.txt”

我得到的输出对我来说很奇怪。我猜测world.txt最初是空的,hello.txt的内容将是stdout到world.txt。

当我运行“cat hello.txt world.txt> world.txt”时   命令 然后检查world.txt中的内容,我看到hello.txt的内容被反复复制。 例如,如果hello.txt的内容为“Hello World!”,那么将打印world.txt “你好,世界 !”很多次就像数百行。

出现这种情况的原因 谢谢

2 个答案:

答案 0 :(得分:2)

您对重定向的理解很好;这是你对cat所缺乏的理解。您的cat实现会将hello.txt的内容写入world.txt(由于重定向,cat 启动时确实为空),然后去进入以下循环:

  1. world.txt读取。
  2. 如果未找到任何数据,请退出
  3. 将数据写入world.txt
  4. GOTO 1
  5. POSIX不需要这样的循环; cat可以(我认为)首先阅读world.txt的全部内容,将其写入标准输出,然后退出而不检查world.txt是否已增长。但出于性能原因,我怀疑没有任何实现可以实际执行此操作。

答案 1 :(得分:1)

首先,cat将打开hello.txt,并且由于重定向,effectivley将其内容复制到world.txt。然而,接下来会发生什么,cat将打开world.txt,现在是hello.txt的副本。当catworld.txt读取数据时,它会将其输出重定向到指定的文件(即world.txt),这意味着总是要读取更多(假设无限磁盘)。 / p>