2009-09-16 39 views
0
ls > ls.out 

这将在列表中包含ls.out。 我的理解是:>(shell输出重定向操作符首先创建一个文件(以获取STDOUT)(如果它尚未存在),然后ls命令即将播放,并在输出中包含刚刚创建的ls.out文件。 这是正确的吗?如果没有,请您详细阐述该命令的工作。了解不存在的文件上的shell重定向

同样

wc temp > temp 

将打印0 0 0温度刚刚创建的临时文件内。

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

+0

有趣,也许。令人惊讶的是,没有。您的wc temp> temp示例是要求wc描述您尚未创建的文件。还有什么要说的? – pavium 2009-09-16 03:48:25

+0

@pavium - 问题是,如果'temp'已经存在,并且你只是搞砸了,并试图获得它的统计数据,你将意外覆盖它,因此没有统计数据。 – 2009-09-16 04:05:24

+0

@pavium:试试这两个,看看有什么不同。 厕所临时 和 厕所温度>温度 在这两种情况下,温度不应该存在。 – 2009-09-16 04:26:31

回答

6

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

+0

感谢您的解释。 – 2009-09-16 06:11:09

1

简单化:

ls正在注视哪个重定向创建的索引节点(目录条目)。

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

编辑:

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

接下来,在ls的情况下,在目录中,所有条目,包括一个针对刚创建ls.out被读取和写入stdout(在这种情况下成为ls.out内容)。

或者,在wc的情况下,它的它计算(无)后,计算换行,字和称最近创建文件的字节数temp里面是空的所以写零计数到文件

文件的内容(templs.out)在所有阅读完成后才写入,因此不能包含它们。

对于更好的方式来比较什么lswc都在做,试试这个命令(当ls.out是不存在的):

ls -l > ls.out 

你应该看到,ls.out文件的大小根据为零到内部列表(cat ls.out),但如果你做ls -l ls.out你会发现它不是零。这对应于您看到wc发生的情况。

+0

丹尼斯可能会提供一些进一步的解释。 – 2009-09-16 06:12:27

+0

谢谢你的解释。 – 2009-09-17 12:52:07

0

考虑wc -l temp > temp

如果temp已经存在,不得不说,20日线仍然cat temp执行上述命令后的结果,这将是0温度。

我想这是因为shell创建一个新的空temp即使temp因此存在覆盖现有的温度,因此当wc试图计算行中temp的Num它得到零。

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