假设要清空的文件名为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
如果不依赖于您使用的操作系统、您拥有的shell和各种实用程序的实现等,那么很难对此进行详细说明。也就是说,对于shell脚本来说,分支子进程通常是一种速度较慢/计算成本较高的事情,因此,如果您希望优化性能,您应该尽量减少脚本创建的进程数量。
在此基础上,: >foo
和true >foo
可能是最好的选择,因为POSIX标准要求shell将它们作为内置实现,这意味着shell将"执行"。
许多shell也实现echo
作为一个内置,但这实际上并不清空文件,它写一个换行符到它。
列表中的所有其他命令通常都是外部的,因此它们需要一个昂贵的进程分支。这样做的计算费用可能会使文件的I/O操作相形见绌。
(哦,cat /dev/null foo
应该是cat /dev/null >foo
)