这个 bash 叉子炸弹是怎么用的?

根据维基百科,下面是一个非常优雅的 bash 叉子炸弹:

:(){ :|:& };:

它是怎么工作的?

33532 次浏览

把它分解成三大块:

:()      # 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.

Edit: William's comment below was a better wording of what I said above, so I've edited to incorporate that suggestion.

Short answer:

冒号(“ :”)变成了一个函数,因此您要运行管道传递给函数的函数,并将其放在后台,这意味着对于每次函数调用,将调用函数的2个副本。递归占据了主导地位。