Questa bomba a forcella mi ricorda sempre ciò che un insegnante di programmazione AI ha detto in una delle prime lezioni che ho frequentato "Per capire la ricorsione, prima devi capire la ricorsione".
Al centro, questa bomba è una funzione ricorsiva . In sostanza, si crea una funzione, che si chiama, che si chiama, che si chiama .... fino a quando le risorse di sistema non vengono consumate. In questo caso specifico, la ricorsione è amplificata dall'uso del piping della funzione su se stesso E del backgrounding.
Ho visto la risposta su StackOverflow e penso che l'esempio fornito lì lo illustri meglio, solo perché è più facile vedere cosa fa a colpo d'occhio (rubato dal link sopra ...)
☃(){ ☃|☃& };☃
Definire la funzione bug ☃() { ... }
, il cui corpo chiama se stesso (la funzione bug), reindirizzare l'output a se stesso (la funzione bug) ☃|☃
e fare da sfondo al risultato &
. Poi, dopo la funzione è definita, in realtà chiamare la funzione bug, ; ☃
.
Noto che almeno sulla mia Arch VM, la necessità di eseguire il background del processo non è un requisito per avere lo stesso risultato finale, consumare tutto lo spazio di processo disponibile e rendere l'host b0rked. In realtà ora ho detto che a volte sembra terminare il processo di fuga e dopo una parte di -bash: fork: Resource temporarily unavailable
esso si fermerà con un Terminated
(e journalctl
mostra il dumping core bash).
Per rispondere alla tua domanda su csh / tcsh, nessuna di queste shell supporta le funzioni, puoi solo alias. Quindi per quelle shell dovresti scrivere uno script shell che si chiama ricorsivamente.
zsh sembra subire lo stesso destino (con lo stesso codice), non esegue il core dump e causa Arch Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.
, ma continua a biforcarsi. Dopo un po 'poi afferma Killed process 162 (systemd-logind) ...
(e continua ancora ad avere un fork bsh).
Arch non sembra avere una pacman
versione di ksh, quindi ho dovuto provarlo su debian. ksh oggetti :
come nome di una funzione, ma usando qualcosa - dire b()
invece sembra avere il risultato desiderato.