На сьогоднішній день Безкорисне використання catнагороди дуже відоме, а також згадка про марне використанняecho (не стосується цього питання). Мені цікаво, чи не повинно бути "Марно використання echoБаш-премії": Труби здаються набагато повільнішими, ніж гередоки та ересті, згідно з деякими високонауковими вимірюваннями:
Гередоки:
for reps in 1 2 3 do time for i in {1..1000} do cat <<'END' test string END done > /dev/null done real 0m1.786s user 0m0.212s sys 0m0.332s real 0m1.817s user 0m0.232s sys 0m0.332s real 0m1.846s user 0m0.256s sys 0m0.320sHerestrings
for reps in 1 2 3 do time for i in {1..1000} do cat <<< 'test string' done > /dev/null done real 0m1.932s user 0m0.280s sys 0m0.288s real 0m1.956s user 0m0.248s sys 0m0.348s real 0m1.968s user 0m0.268s sys 0m0.324sПеренаправлення
for reps in 1 2 3 do time for i in {1..1000} do echo 'test string' | cat done > /dev/null done real 0m3.562s user 0m0.416s sys 0m0.548s real 0m3.924s user 0m0.384s sys 0m0.604s real 0m3.343s user 0m0.400s sys 0m0.552s
Взагалі гередоки та герестини мають однакову швидкість (це лише один набір даних із декількох тестів), тоді як перенаправлення постійно більш ніж на 50% повільніше. Я щось не розумію, чи це можна використовувати як загальне правило для команд, що читають стандартний вхід в Bash?
cat <<ENDпроти cat <<< "test string"проти echo "test string" | catабо cat <<'END'проти cat <<< 'test string'проти echo 'test string' | catмати однакову кількість розкладання в виконанні оболонки на струнах.
$(seq $reps)?
seqнагороду за "марне використання " ;-)