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