Há algumas perguntas relacionadas à fork bomb para bash :(){ :|: & };:
, mas quando verifiquei as respostas ainda não consegui descobrir o que exatamente a parte da bomba está fazendo quando uma função passa para a próxima, basicamente esta parte: :|:
.
Entendo até agora que o símbolo de barra vertical conecta dois comandos conectando a saída padrão do primeiro à entrada padrão do segundo, por exemplo, echo "Os perus dominarão o mundo" | sed 's/s//'.
Mas eu não entendo o que a primeira função está empurrando para fora de seu padrão, que é empurrado para o segundo, afinal não há valores de retorno definidos dentro da função, então o que está viajando pela centopéia humana se o homem no começo está com o estômago vazio?
Responder1
Resposta curta: nada.
Se um processo não receber nada no STDIN, você ainda poderá canalizá-lo. Da mesma forma, você ainda pode canalizar um processo que não produz nada em STDOUT. Efetivamente, você está simplesmente canalizando um único indicador EOF para o segundo processo, que é simplesmente ignorado. A construção com tubo é simplesmente uma variação do tema “cada processo começa mais dois”. Esta bomba garfo também pode ser (e às vezes é) escrita como:
:(){ :&:; }; :
Onde a primeira chamada recursiva é colocada em segundo plano imediatamente, a segunda chamada é feita.
Em geral, sim, o símbolo de barra vertical ( |
) é usado para fazer exatamente o que você mencionou - conectar STDOUT do primeiro processo ao STDIN do segundo processo. Isso também é o que está acontecendo aqui, embora a única coisa que passa por esse tubo seja o único indicador EOF.