Essa bomba de bifurcação sempre me lembra o que um professor de programação de IA disse em uma das primeiras lições que participei "Para entender a recursão, primeiro você precisa entender a recursão".
Na sua essência, esta bomba é uma função recursiva . Em essência, você cria uma função que se autodenomina, que autodenomina, que autodenomina ... até que os recursos do sistema sejam consumidos. Nesse caso específico, a recursão é amplificada pelo uso de canalizar a função para si mesma E em segundo plano.
Eu já vi isso respondido no StackOverflow , e acho que o exemplo dado aqui ilustra melhor, apenas porque é mais fácil ver o que ele faz de relance (roubado do link acima ...)
☃(){ ☃|☃& };☃
Defina a função bug ☃() { ... }
, cujo corpo se chama (função bug), canalizando a saída para si (a função bug) ☃|☃
e ponha em segundo plano o resultado &
. Depois que a função for definida, chame a função bug ; ☃
,.
Observo que, pelo menos na minha VM do Arch, a necessidade de background do processo não é um requisito para ter o mesmo resultado final, consumir todo o espaço de processo disponível e tornar o host b0rked. Na verdade, agora eu disse que às vezes parece que encerra o processo de fuga e depois que uma tela -bash: fork: Resource temporarily unavailable
dele para com um Terminated
(e journalctl
mostra o bash core dumping).
Para responder sua pergunta sobre csh / tcsh, nenhum desses shells suporta funções, você pode apenas usar o alias. Portanto, para esses shells, você teria que escrever um script de shell que se chama recursivamente.
O zsh parece sofrer o mesmo destino (com o mesmo código), não core dump e faz com que Arch dê Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.
, mas ainda continua a bifurcar. Depois de um tempo, ele afirma Killed process 162 (systemd-logind) ...
(e continua a ter um zsh bifurcado).
O Arch não parece ter uma pacman
versão do ksh, então tive que experimentá-lo no debian. objetos ksh :
como um nome de função, mas usar algo - digamos, b()
parece ter o resultado desejado.