Наведу приклад:
$ 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).