Bash-为什么不使用临时文件就不能覆盖文件?

时间:2015-01-18 18:03:02

标签: bash overwrite

覆盖文件的标准程序通常如下:

awk '{print $2*3}' file > tmp file
tmpFile > file

然而,有时这会带来一些麻烦,因为必须在不再使用临时文件后删除它。

那么,为什么不能以下列方式执行此操作(不需要临时文件):

awk '{print $2*3}' file > file

我问的原因是因为我知道可以这样附加到文件:

awk '{print $2*3}' file >> file

因此,如果使用上面显示的>>附加文件,工作正常,为什么不能以相同的方式覆盖文件。为什么这两个命令如此不同?

此外,是否存在绕过对临时文件的需求的方法(可能采用类似于第二段摘录的方式),或者是第一个摘录的唯一途径?

注意:awk命令无关紧要,可以用任何其他命令替换

2 个答案:

答案 0 :(得分:1)

使用临时文件是一个好主意,因为您永远无法确定整个文件是否会被读入内存。如果您在阅读之前尝试编写它,那么您可能会得到与您预期不同的结果。

使用append时,命令总是在添加新内容之前遍历整个文件,因此永远不会有文件的一部分要读取。

答案 1 :(得分:1)

可能不是一个好主意(尝试阅读和写入相同的文件),但如果你坚持这样做,你可以使用<>运算符。

gawk '{print $2*3}' -- <> file