0
ls > ls.out

这也将 ls.out 包含在列表中。我的理解是: > (shell 输出重定向运算符首先创建一个文件(以获取 STDOUT),如果它不存在,然后 ls 命令开始播放,它在输出中包含刚刚创建的 ls.out 文件。这是正确的吗?如果不是,请您详细说明该命令的工作原理。

相似地

wc temp > temp

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

shell 的这种行为很有趣。我想知道,它实际上是如何工作的。顺便说一句,两者都是 The Unix Programming Environment Book 中的练习。正如我上面提到的答案,我希望一些专家纠正我的理解。

4

3 回答 3

6

使用 重定向标准输出时>,如果文件不存在,shell 将创建文件(作为空文件)。此外,该文件在 shell 派生并执行正在执行的命令之前打开。当你这样做wc temp > temp时,shell 打开文件进行写入,然后 fork 和 execs wc,在进程中传递它的打开文件句柄。

于 2009-09-16T03:47:55.570 回答
2

简单化:

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

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

编辑:

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

接下来,在 的情况下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.

于 2009-09-16T04:23:06.560 回答
0

考虑wc -l temp > temp

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

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

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

于 2009-12-16T17:40:37.770 回答