代码之家  ›  专栏  ›  技术社区  ›  Senthil Kumaran

理解非存在文件上的shell重定向

  •  0
  • Senthil Kumaran  · 技术社区  · 17 年前
    ls > ls.out
    

    这也将在列表中包括ls.out。 我的理解是:>(shell output redirection操作符首先创建一个文件(以获取标准输出),如果该文件尚不存在,那么ls命令将开始播放,并且它将刚创建的ls.out文件包含在输出中。 这是正确的吗?如果没有,请详细说明该命令的工作原理。

    同样地

    wc temp > temp
    

    将在刚创建的临时文件中打印0临时文件。

    shell的这种行为很有趣。我想知道它到底是如何工作的。顺便说一句,这两个都是Unix编程环境书中的练习。正如我上面提到的答案,我希望一些专家纠正我的理解。

    3 回复  |  直到 17 年前
        1
  •  6
  •   Adam Rosenfield    17 年前

    使用重定向标准输出时 > wc temp > temp ,shell打开文件进行写入,然后fork和exec wc

        2
  •  2
  •   Dennis Williamson    17 年前

    过于简单化:

    ls 正在查看重定向创建的inode(目录项)。

    wc 可以看到重定向创建的inode,但当它查看内容时,它们是空的,因为(

    编辑:

    首先,在这两种情况下,重定向( >ls.out >temp inodes .

    其次,在 ls ,目录中的所有条目, 包括一个 ls.out 这是刚刚创建的 stdout 出局

    或者,在 厕所 ,它计算最近创建的名为 temp 因此它将零计数写入文件 之后 这不重要。

    文件的内容( 临时雇员 出局 )在所有阅读完成后才写入,因此它们不能包含在内。

    暂时 更好的比较方法 什么 厕所 如果正在执行,请尝试此命令(当 不存在):

    ls -l > ls.out
    

    您应该看到 出局 根据其中包含的列表,值为零( cat ls.out ),但如果你 ls -l ls.out 你会发现它不是零。这与你所看到的情况相符 厕所 .

        3
  •  0
  •   Kirk It looks like    13 年前

    考虑 wc -l temp > temp

    如果 temp cat temp 执行上述命令后,它将为0 temp。

    我认为这是因为shell创建了一个新的空 临时雇员 即使 已存在,因此覆盖了现有的温度,因此 wc 尝试计算中的行数 临时雇员 它得到零。

    实际上 > temp wc -l temp 被执行。