Наведу приклад:
$ timeout 1 yes "GNU" > file1
$ wc -l file1
11504640 file1
$ for ((sec0=`date +%S`;sec<=$(($sec0+5));sec=`date +%S`)); do echo "GNU" >> file2; done
$ wc -l file2
1953 file2
Тут ви бачите, що команда yes
записує 11504640
рядки за секунду, тоді як я можу записати лише 1953
рядки за 5 секунд, використовуючи bash for
та echo
.
Як запропоновано в коментарях, існують різні хитрощі, щоб зробити його більш ефективним, але жоден не підходить до відповідності швидкості yes
:
$ ( while :; do echo "GNU" >> file3; done) & pid=$! ; sleep 1 ; kill $pid
[1] 3054
$ wc -l file3
19596 file3
$ timeout 1 bash -c 'while true; do echo "GNU" >> file4; done'
$ wc -l file4
18912 file4
Вони можуть записати до 20 тисяч рядків за секунду. І їх можна вдосконалити:
$ timeout 1 bash -c 'while true; do echo "GNU"; done >> file5'
$ wc -l file5
34517 file5
$ ( while :; do echo "GNU"; done >> file6 ) & pid=$! ; sleep 1 ; kill $pid
[1] 5690
$ wc -l file6
40961 file6
Вони отримують нас до 40 тисяч рядків за секунду. Краще, але все-таки далекий крик, від yes
якого можна написати близько 11 мільйонів рядків за секунду!
Отже, як yes
записати у файл так швидко?
date
це дещо велика вага, плюс оболонка повинна повторно відкрити вихідний потік echo
для кожної ітерації циклу. У першому прикладі є лише одне виклик команди з одним перенаправленням виходу, і команда надзвичайно легка. Двоє жодним чином не порівнянні.
date
може бути важкою, див. Редагування мого питання.
timeout 1 $(while true; do echo "GNU">>file2; done;)
це неправильний спосіб використання, timeout
оскільки timeout
команда запуститься лише після завершення заміни команди. Використовуйте timeout 1 sh -c 'while true; do echo "GNU">>file2; done'
.
write(2)
системні дзвінки, а не на завантаження суден інших системних дзвінків, накладних оболонок або навіть створення процесу у вашому першому прикладі (який працює і чекає date
кожного друку рядка у файл). Однієї секунди написання ледве вистачає для того, щоб вузьке місце на диску вводу / виводу (а не процесорі / пам'яті), в сучасній системі з великою кількістю оперативної пам'яті. Якщо дозволяти працювати довше, різниця була б меншою. (Залежно від того, наскільки погана реалізація bash ви використовуєте, та відносна швидкість процесора та диска, ви навіть не можете наситити дискові введення / виведення bash).