为什么“awk ... file | tee file”会截断文件?

为什么“awk ... file | tee file”会截断文件?

为什么此管道会截断文件:

awk '...' file | tee file

cat先 ing 不是吗?

cat file | awk '...' | tee file

该文件只是一个有数百行的常规配置文件。我习惯tee避免使用sponge(因为我必须moreutils先安装)。

答案1

从长远来看,你会发现这种行为并不一致。

问题是,tee在某个时间点打开文件进行写入。从那一刻起,文件就会被截断。这与哪个程序读取该文件无关。

它只是发生得非常快,并且在打开文件cat之前显然已经完成了文件的读取。tee但如果例如系统负载较大,cat可能还没有完成,并且管道cat也可能被截断。

因此,请勿写入与读取管道的同一个文件。相反,请使用 Gnu awk's -i inplace,或者如果您的系统上不可用,请使用

cp file file.tmp &&
awk '...' file.tmp | tee file

相关内容