: () {: |: &} ;: Como esta bomba bifurcada BASH funciona em detalhes? [duplicado]

1

Eu tenho uma compreensão muito fragmentada de shells, subshells, funções, processos em segundo plano e, portanto, estou inseguro em entender como essa fork fork funciona em detalhes,

No entanto, eu te digo como o que eu sei:

  • :() Aqui o sinal de dois pontos é simplesmente um nome de função com aparência incomum
  • {...} Aqui está descrito o que a função está fazendo
  • {:()} Aqui a função chama a próxima iteração de si mesma
  • {: () &} Aqui a função chama a si mesma e coloca a próxima iteração de si mesma no plano de fundo do shell
  • ...;: O último cólon é o ponto de partida da execução real da função, o que é antes é apenas a sua definição
Portanto, meu entendimento básico é que é uma função recursiva, que funciona como uma máquina de desova, gerando cópias de si mesmo até o ponto em que o sistema não pode mais proliferar o bem-estar social.

Mas, eu realmente não entendo de maneira visual o que está acontecendo passo a passo.

Por exemplo

  • :() |: () & Por que ambos os chamados de função são combinados através de um símbolo de pipe?
  • A desova da bifurcação é linear, um número constante de processos por unidade de tempo ou é mais exponencialmente exagerada como as duas chamadas de função sugerem.

Poderia alguém fornecer adicionalmente uma tira em quadrinhos visual passo a passo do processo de desova, não importa o quão desleixada?

    
por sharkant 12.05.2017 / 23:04

1 resposta

1

Aqui está uma explicação visual; desculpe, não é uma história em quadrinhos, mas deve ilustrar:

  • etapa 1: execute a função

    :
    
  • etapa 2: a função executa duas cópias de si mesma, usando um pipe para iniciar ambas em paralelo (o operador de plano de fundo não parece realmente importar aqui, conforme descrito na resposta a Como funciona uma bomba bifurcada? )

    (:|:)
    

    (estou usando parênteses aqui apenas para esclarecer)

  • etapa 3: repita o processo para cada :

    ((:|:)|(:|:))
    
  • e assim continua

    (((:|:)|(:|:))|((:|:)|(:|:)))
    

    e on, substituindo cada : por (:|:) em cada etapa

    ((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))
    
    (((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))|((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:)))))
    
    ((((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))|((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:)))))|(((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))|((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))))
    

até que o sistema fique sem recursos (até o momento ele ficará muito pouco responsivo).

    
por 12.05.2017 / 23:26