理解不存在的文件上的shell重定向
-
07-07-2019 - |
题
ls > ls.out
这也包括列表中的ls.out。 我的理解是:> (shell输出重定向操作符首先创建一个文件(取STDOUT),如果它尚未存在,然后ls命令即将播放,它在输出中包含刚刚创建的ls.out文件。 它是否正确?如果没有,请你详细说明该命令的运作情况。
类似地
wc temp > temp
将在刚刚创建的临时文件中打印0 0 0 temp。
shell的这种行为很有趣。我想知道它是如何工作的。顺便说一句,两者都是Unix编程环境手册中的练习。正如我上面提到的答案,我想要一些专家纠正我的理解。
解决方案
当使用>
重定向标准输出时,如果文件尚不存在,shell将创建该文件(作为空文件)。此外,该文件在shell分叉并执行正在执行的命令之前打开。当你执行 wc temp> temp
,shell打开文件进行写入,然后分叉和执行 wc
,在此过程中传递其打开的文件句柄。
其他提示
简单化:
ls
正在查看重定向创建的inode(目录条目)。
wc
可以看到重定向创建的inode,但是当它查看内容时它们是空的,因为它( wc
)还没有写入它们。 / p>
编辑:
首先,在这两种情况下,重定向(> ls.out
或> temp
)会创建一个空文件。目录中的条目(inode)指向文件的位置并包含有关它的一些信息。请参阅有关 inodes 的维基百科文章。
接下来,对于 ls
,目录中的所有条目包括刚刚创建的 ls.out
的条目 ,读取和写入 stdout
(在这种情况下成为 ls.out
的内容)。
或者,在 wc
的情况下,它计算最近创建的文件的新行,字和字节计数,该文件名为 temp
,为空所以它将零计数写入文件 之后计算(无)。
文件的内容( temp
或 ls.out
)直到完成所有读取后才会写入,因此无法包含它们。
要更好地比较 ls
和 wc
正在做什么,请尝试此命令(当 ls.out 代码>不存在):
ls -l > ls.out
根据 cat ls.out
中包含的列表,您应该看到 ls.out
的文件大小为零,但如果您执行 ls -l ls.out
你会发现它不是零。这与您在 wc
中看到的内容相对应。
考虑 wc -l temp>温度代码>
如果 temp
已经存在,并且在执行上述命令后仍然有20行仍然是 cat temp
的结果,那么它将是0 temp。
我认为这是因为shell创建了一个新的空 temp
,即使存在 temp
,因此会覆盖现有的temp,因此当 wc
尝试时计算 temp
中的行数,它变为零。
实际上> temp
首先由shell执行,然后执行 wc -l temp
。