Trong bash, touch
là một nhị phân bên ngoài, nhưng echo
là một phần tử dựng sẵn :
$ type echo
echo is a shell builtin
$ type touch
touch is /usr/bin/touch
Vì touch
là một nhị phân bên ngoài và bạn gọi touch
một lần cho mỗi tệp, trình bao phải tạo 300.000 trường hợp touch
, việc này mất nhiều thời gian.
echo
tuy nhiên, là một nội dung được tích hợp sẵn và việc thực hiện các nội dung trong trình bao không hoàn toàn không cần thiết. Thay vào đó, shell hiện tại thực hiện tất cả các hoạt động và không có quy trình bên ngoài nào được tạo ra; đây là lý do tại sao nó nhanh hơn nhiều
Đây là hai hồ sơ hoạt động của shell. Bạn có thể thấy rằng rất nhiều thời gian được dành để nhân bản các quy trình mới khi sử dụng touch
. Sử dụng /bin/echo
thay cho vỏ dựng sẵn sẽ hiển thị một kết quả tương đương hơn nhiều.
Sử dụng cảm ứng
$ 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
[...]
Sử dụng tiếng vang
$ 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
sẽ nối thêm một dòng mới$file
và do đó sửa đổi nó. Tôi giả sử nó sẽ giống với OS / X. Nếu bạn không muốn điều đó, hãy sử dụngecho -n >> $file
.