为什么重定向到同一个文件会截断文件?
通常我们使用不同的文件来重定向输出。
例如 :
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
没有什么不同。