根据维基百科,以下是一款非常优雅的bash fork炸弹:
:(){ :|:& };:
它是如何运作的?
答案 0 :(得分:159)
打破它,有三大块:
:() # 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.
编辑:下面威廉的评论是我上面所说的更好的措辞,所以我编辑了这个建议。
答案 1 :(得分:9)
简短回答:
冒号(“:”)成为一个函数,因此您运行管道函数并将其放入背景中,这意味着每次调用函数时都会调用2个函数副本。递归就掌握了。