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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top