Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 理解非存在文件上的shell重定向_Unix_Shell_Io Redirection - Fatal编程技术网

Unix 理解非存在文件上的shell重定向

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.out。 我的理解是:>(shell output redirection操作符首先创建一个文件(以获取标准输出),如果该文件尚不存在,则会播放ls命令,并在输出中包含刚刚创建的ls.out文件。 这是正确的吗?如果不是,请详细说明该命令的工作原理

同样地

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