ls > ls.out
这也包括列表中的ls.out。 我的理解是:> (shell输出重定向操作符首先创建一个文件(取STDOUT),如果它尚未存在,然后ls命令即将播放,它在输出中包含刚刚创建的ls.out文件。 它是否正确?如果没有,请你详细说明该命令的运作情况。
类似地
wc temp > temp
将在刚刚创建的临时文件中打印0 0 0 temp。
shell的这种行为很有趣。我想知道它是如何工作的。顺便说一句,两者都是Unix编程环境手册中的练习。正如我上面提到的答案,我想要一些专家纠正我的理解。
答案 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
的文件的新行,字和字节数,该文件为空,因此它会写入零计入后>>计数(无)。
文件的内容(temp
或temp
)在完成所有阅读后才会被写入,因此无法包含这些内容。
要更好地比较 ls.out
和ls
正在做什么,请尝试此命令(当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
。