Unix 理解非存在文件上的shell重定向
这也将在列表中包括ls.out。 我的理解是:>(shell output redirection操作符首先创建一个文件(以获取标准输出),如果该文件尚不存在,则会播放ls命令,并在输出中包含刚刚创建的ls.out文件。 这是正确的吗?如果不是,请详细说明该命令的工作原理 同样地Unix 理解非存在文件上的shell重定向,unix,shell,io-redirection,Unix,Shell,Io Redirection,这也将在列表中包括ls.out。 我的理解是:>(shell output redirection操作符首先创建一个文件(以获取标准输出),如果该文件尚不存在,则会播放ls命令,并在输出中包含刚刚创建的ls.out文件。 这是正确的吗?如果不是,请详细说明该命令的工作原理 同样地 ls > ls.out 将在刚创建的临时文件中打印0临时文件 shell的这种行为很有趣。我想知道它实际上是如何工作的。顺便说一句,这两个都是Unix编程环境书中的练习。正如我上面提到的答案,我希望一些专家纠正
ls > ls.out
将在刚创建的临时文件中打印0临时文件
shell的这种行为很有趣。我想知道它实际上是如何工作的。顺便说一句,这两个都是Unix编程环境书中的练习。正如我上面提到的答案,我希望一些专家纠正我的理解。当使用
重定向标准输出时,shell将创建文件(作为空文件)如果该文件不存在。此外,该文件在shell派生并执行正在执行的命令之前打开。当您执行wc temp>temp
时,shell将打开该文件进行写入,然后派生并执行wc
,并在过程中传递其打开的文件句柄。过于简化:
ls
正在查看重定向创建的inode(目录项)
wc
可以看到重定向创建的inode,但当它查看内容时,它们是空的,因为(wc
)尚未写入它们
编辑:
首先,在这两种情况下,重定向(>ls.out
或>temp
)都会创建一个空文件。目录中的一个条目(inode)会指向文件的位置并包含一些有关它的信息。请参阅上的Wikipedia文章
接下来,在ls
的情况下,目录中的所有条目,包括刚刚创建的ls.out
的条目,都被读写到stdout
(在这种情况下,它成为ls.out
的内容)
或者,在wc
的情况下,它计算最近创建的名为temp
的文件的换行、字和字节计数,该文件为空,因此它在计数后将零计数写入文件(无)
文件的内容(temp
或ls.out
)在所有读取完成后才会写入,因此不能包含这些内容
为了更好地比较ls
和wc
正在做的事情,请尝试此命令(当ls.out
不存在时):
根据内部包含的列表(
cat ls.out
),您应该看到ls.out
的文件大小为零,但如果执行ls-l ls.out
操作,您将看到它不是零。这与您看到的wc
发生的情况相对应wc-l temp>考虑wc-l temp>temp
如果执行上述命令后,temp
已经存在,并且仍然有20行是cat temp
的结果,那么它将是0 temp
我认为这是因为shell创建了一个新的空temp
,即使temp
已经存在,也会覆盖现有的temp,因此当wc
尝试计算temp
中的行数时,它会得到零
实际上,>temp
首先由shell执行,然后执行wc-l temp
。可能很有趣。令人惊讶的是,没有。你的wc temp>temp示例要求wc描述一个你还没有创建的文件。它还会说些什么?@pavium-问题是,如果temp
已经存在,而你只是搞砸了如果你试图获取它的统计信息,你会意外地覆盖它,因此没有统计信息。@pavium:试试这两种方法,看看它们的区别。wc temp和wc temp>temp在这两种情况下,temp都不应该存在。丹尼斯,进一步的解释可能会有所帮助。
wc temp > temp
ls -l > ls.out