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

时间:2009-09-16 03:43:22

标签: unix shell io-redirection

ls > ls.out

这也包括列表中的ls.out。 我的理解是:> (shell输出重定向操作符首先创建一个文件(取STDOUT),如果它尚未存在,然后ls命令即将播放,它在输出中包含刚刚创建的ls.out文件。 它是否正确?如果没有,请你详细说明该命令的运作情况。

类似地

wc temp > temp

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

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

3 个答案:

答案 0 :(得分:6)

当使用>重定向标准输出时,如果文件尚不存在,shell将创建该文件(作为空文件)。此外,该文件在shell分叉并执行正在执行的命令之前打开。执行wc temp > temp时,shell会打开文件进行写入,然后分叉和执行wc,并在此过程中传递其打开的文件句柄。

答案 1 :(得分:1)

简单化:

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

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

编辑:

首先,在这两种情况下,重定向(>ls.out>temp)都会创建一个空文件。目录中的条目(inode)指向文件的位置并包含有关它的一些信息。请参阅inodes上的维基百科文章。

接下来,对于ls,目录中的所有条目包括刚刚创建的ls.out 的条目,都会被读取并写入{{ 1}}(在这种情况下成为stdout的内容)。

或者,在ls.out的情况下,它会计算最近创建的名为wc 的文件的新行,字和字节数,该文件为空,因此它会写入零计入后>计数(无)。

文件的内容(temptemp)在完成所有阅读后才会被写入,因此无法包含这些内容。

更好地比较 ls.outls正在做什么,请尝试此命令(当wc不存在时):

ls.out

根据(ls -l > ls.out )中包含的列表,您应该看到ls.out的文件大小为零,但如果您cat ls.out,则会看到它不为零。这与ls -l ls.out发生的事情相对应。

答案 2 :(得分:0)

考虑wc -l temp > temp

如果temp已经存在并且在执行上述命令后仍然说cat temp的结果为20行,那么它将是0 temp。

我认为这是因为即使存在temp,shell也会创建一个新的空temp,从而覆盖现有的temp,因此当wc尝试计算temp中的行数时1}}它变为零。

实际上> temp首先由shell执行,然后执行wc -l temp