为什么重定向到同一个文件会截断文件?

通常我们使用不同的文件来重定向输出。

例如 :

cat  temp 

在此命令中,first的内容被重定向到temp而不是标准输出。

如果我使用相同的文件名,为什么它会截断文件?

为什么不能覆盖同一个文件?

 cat  first 

当您使用这样的I / O重定向时,shell将执行命令之前打开“input”和“output”文件。 打开文件进行覆盖与写入前截断文件相同。 结果: cat在输入上看到一个空文件…

因为在一般情况下处理它会非常复杂。 请考虑以下示例:

程序逐行读取文件并输出每行两次。 现在为了在没有第二个文件(即在同一文件上)的情况下工作,程序将需要缓冲它将读取的大多数(所有)行,因为在它们被读取之前它们将被覆盖。

为了保持简单,程序通常使用一个辅助的临时文件,一旦完成它们就会移动到原始文件上。 这是例如sed -i (内联)如何工作。

通常情况下,重定向的语法应该是cat first > temp 。 这意味着cat的输出first被发送到temp文件。 对于语句cat < first > temp ,输出cat在重定向到再次输出时尚未完成。 什么都没有导致任何结果。

但是,捕获文件并将输出重定向到另一个文件与基本cp没有什么不同。