Eu não sei exatamente qual é o uso prático deste exercício, mas para matar os processos em segundo plano, eu recomendo salvar o ID do processo de $!
e depois gravá-lo com kill
.
O elemento de script em background com &
é executado em um subshell, um processo de shell distinto, de modo que nenhuma alteração nas variáveis do shell produz efeito, em um sentido ou no outro. (Geralmente, isso só acontece com mudanças na criança que não aparecem no pai, já que geralmente esperamos que o processo filho seja concluído.)
Isto:
#!/bin/bash
i=0
while true; do # the loop runs forever, so just use 'true' here
let "i+=1"
echo $i "--------------"
j=0
while true; do
let "j+=1"
echo $j $i
sleep .2
done &
pid=$!
# disown # remove the comment marker here
sleep .5 # shorter timeout
kill $pid
done
impressões:
1 --------------
1 1
2 1
3 1
2 --------------
1 2
2 2
3 2
loop.sh: line 19: 4113 Terminated while true; do
let "j+=1"; echo $j $i; sleep .2;
done
3 --------------
1 3
2 3
...
O shell imprime avisos quando vê seus processos filhos morrendo, podemos nos livrar disso por disown
ing o filho (remova o marcador de comentário da linha).