Как работает эта bash вилка?

Согласно Википедии, следующая очень изящная боковая вилка 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 копии функции. Рекурсия сохраняется.