以下清空文件的方式有什么区别?
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 计算量大的事情之一,因此如果您想优化性能,您应该尽量减少脚本创建的进程数。
在此基础上,: >foo
和 true >foo
可能是最佳选择,因为 POSIX 标准要求 shells 将它们实现为内置函数,这意味着shell 将直接“执行”它而无需分叉子进程。
许多 shells 也将 echo
作为内置实现,但实际上并没有清空文件,它向文件写入一个换行符。
您列表中的所有其他命令通常都是外部命令,因此它们需要昂贵的进程分支。这样做的计算开销可能会使 I/O 文件的完成方式相形见绌。
(哦,cat /dev/null foo
应该是 cat /dev/null >foo
。)
假设要清空的文件名为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 计算量大的事情之一,因此如果您想优化性能,您应该尽量减少脚本创建的进程数。
在此基础上,: >foo
和 true >foo
可能是最佳选择,因为 POSIX 标准要求 shells 将它们实现为内置函数,这意味着shell 将直接“执行”它而无需分叉子进程。
许多 shells 也将 echo
作为内置实现,但实际上并没有清空文件,它向文件写入一个换行符。
您列表中的所有其他命令通常都是外部命令,因此它们需要昂贵的进程分支。这样做的计算开销可能会使 I/O 文件的完成方式相形见绌。
(哦,cat /dev/null foo
应该是 cat /dev/null >foo
。)