以下清空文件的方式有什么区别?

What is the difference between the following ways to empty files?

假设要清空的文件名为foo,常见的清空文件方式如下。我想知道它们之间的区别,比如性能,I/O对系统的压力等等

#1 also ":>foo" and "true>foo" 
echo > foo

#2
dd if=/dev/null of=foo

#3
cp /dev/null >foo

#4
cat /dev/null >foo

#5
truncate -s 0 foo

很难说这不取决于您正在使用的 OS,shell 和您拥有的各种实用程序的实现等。也就是说,分叉子流程对于 shell 脚本来说,这通常是 slower/more 计算量大的事情之一,因此如果您想优化性能,您应该尽量减少脚本创建的进程数。

在此基础上,: >footrue >foo 可能是最佳选择,因为 POSIX 标准要求 shells 将它们实现为内置函数,这意味着shell 将直接“执行”它而无需分叉子进程。

许多 shells 也将 echo 作为内置实现,但实际上并没有清空文件,它向文件写入一个换行符。

您列表中的所有其他命令通常都是外部命令,因此它们需要昂贵的进程分支。这样做的计算开销可能会使 I/O 文件的完成方式相形见绌。

(哦,cat /dev/null foo 应该是 cat /dev/null >foo。)