
Em teoria, com este bloco, você deveria ver "running..." apenas uma vez (ou menos), mas na prática, ele se repete até ser eliminado manualmente. Como altero o valor de x dentro do processo bifurcado para falso fora do processo bifurcado após a função "iniciar" ter sido chamada?
export x=true
start() {
while [ $x == true ]; do
echo running...
sleep 1
done
}
start &
x=false
Responder1
A solução simples aqui é usar algum tipo de comunicação entre processos para informar ao processo alvo para fazer a mudança. Por exemplo, você pode usar sinais:
#!/bin/sh
export x=true
start() {
trap x=false USR1
while [ $x = "true" ]; do
echo running...
sleep 1
done
}
start &
sleep 5
kill -USR1 $!
wait
produz esta saída:
$ ./testit.sh
running...
running...
running...
running...
running...
$
Responder2
Se estiver usando ksh93
, você pode usar funções de disciplina para implementar variáveis compartilhadas (vejahttps://stackoverflow.com/questions/13726293/environment-variables-to-be-used-across-multiple-korn-ksh93-shell-scripts-get)
Alternativamente, você pode usar fish
which implementa esse recurso através de um daemon:pescar.