这个前叉炸弹总是让我想起AI编程老师在我参加的第一批课程中所说的话:“要了解递归,首先必须了解递归”。
从本质上讲,该炸弹是递归函数。本质上,您创建了一个函数,该函数调用自身,调用自身,调用自身....,直到消耗系统资源为止。在此特定实例中,通过使用将函数传递给自身并对其进行背景处理来放大递归。
我已经在StackOverflow上看到了这个答案,并且我认为给出的示例最好地说明了这一点,只是因为一眼就能看出它的作用(从上面的链接中窃取了……)。
☃(){ ☃|☃& };☃
定义bug函数☃() { ... }
,其主体调用自身(bug函数),将输出传递给自身(bug函数) ☃|☃
,并为结果提供背景&
。然后,在定义函数后,实际调用bug函数; ☃
。
我注意到,至少在我的Arch VM上,不需要使进程后台具有相同的最终结果,就不需要消耗所有可用的进程空间并渲染主机。实际上,我现在已经说过,它有时似乎会终止失控过程,并且在对其进行筛选后-bash: fork: Resource temporarily unavailable
将以停止Terminated
(并journalctl
显示bash核心转储)。
要回答有关csh / tcsh的问题,这些shell都不支持功能,您只能使用别名。因此,对于这些Shell,您必须编写一个递归调用自身的Shell脚本。
zsh似乎遭受了相同的命运(具有相同的代码),没有核心转储并导致Arch放弃Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.
,但它仍然继续派生。一段时间后,它会声明Killed process 162 (systemd-logind) ...
(并且仍然有分叉的zsh)。
Arch似乎没有pacman
ksh版本,因此我不得不在debian上尝试。ksh将其:
作为函数名,但是使用了一些东西- b()
好像看起来具有期望的结果。