在bash中,touch
是一个外部二进制文件,但是echo
一个内置的shell:
$ type echo
echo is a shell builtin
$ type touch
touch is /usr/bin/touch
由于touch
是外部二进制文件,并且touch
每个文件调用一次,因此外壳程序必须创建300,000个的实例touch
,这需要很长时间。
echo
但是,它是Shell内置的,而Shell内置的执行根本不需要分叉。相反,当前的shell会执行所有操作,并且不会创建任何外部进程。这就是为什么它要快得多的原因。
这是外壳程序操作的两个配置文件。您会看到使用时,克隆新进程花费了大量时间touch
。使用/bin/echo
而不是内置的shell应该显示出更可比的结果。
使用触控
$ strace -c -- bash -c 'for file in a{1..10000}; do touch "$file"; done'
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
56.20 0.030925 2 20000 10000 wait4
38.12 0.020972 2 10000 clone
4.67 0.002569 0 80006 rt_sigprocmask
0.71 0.000388 0 20008 rt_sigaction
0.27 0.000150 0 10000 rt_sigreturn
[...]
使用回声
$ strace -c -- bash -c 'for file in b{1..10000}; do echo >> "$file"; done'
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
34.32 0.000685 0 50000 fcntl
22.14 0.000442 0 10000 write
19.59 0.000391 0 10011 open
14.58 0.000291 0 20000 dup2
8.37 0.000167 0 20013 close
[...]
echo >> $file
它将在其中添加换行符$file
并对其进行修改。我认为对于OS / X它将是相同的。如果您不想这样做,请使用echo -n >> $file
。