Согласно Википедии, следующая очень изящная боковая вилка bash:
:(){ :|:& };:
Как это работает?
Ответ 1
Разбивая его, есть три большие части:
:() # Defines a function, ":". It takes no arguments.
{ ... }; # The body of the function.
: # Invoke the function ":" that was just defined.
Внутри тела функция вызывается дважды, а конвейер - в фоновом режиме; каждый последующий вызов на процессы порождает еще больше вызовов на ":". Это быстро приводит к взрывному потреблению в системных ресурсах, прерывая работу.
Обратите внимание, что вызов его один раз, бесконечно рекурсивный, не будет достаточно хорошим, поскольку это просто приведет к переполнению стека в исходном процессе, что является грязным, но с ним можно справиться.
Более удобная для человека версия выглядит следующим образом:
kablammo() { # Declaration
kablammo | kablammo& # The problematic body.
}; kablammo # End function definition; invoke function.
Изменить: Нижеприведенный комментарий Уильяма был лучшей формулировкой того, что я сказал выше, поэтому я отредактировал, чтобы включить это предложение.
Ответ 2
Короткий ответ:
Двоеточие ( ":" ) становится функцией, поэтому вы запускаете функцию, переданную в функцию, и помещаете ее в backgroun, что означает, что для каждого вызова функции вызывается 2 копии функции. Рекурсия сохраняется.