bashではtouch
、外部バイナリecho
ですが、組み込みのシェルです:
$ type echo
echo is a shell builtin
$ type touch
touch is /usr/bin/touch
以来touch
、外部バイナリで、あなたが起動しtouch
、ファイルごとに一度、シェル30万個のインスタンスの作成する必要がありtouch
、長い時間がかかります。
echo
ただし、シェル組み込みコマンドであり、シェル組み込みコマンドの実行にはフォークはまったく必要ありません。代わりに、現在のシェルがすべての操作を実行し、外部プロセスは作成されません。これが非常に速い理由です。
シェルの操作の2つのプロファイルを以下に示します。を使用すると、新しいプロセスのクローン作成に多くの時間が費やされることがわかりtouch
ます。/bin/echo
シェルの代わりにビルトインを使用すると、はるかに類似した結果が表示されます。
タッチを使用する
$ 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
。