
En teoría, con este bloque, solo deberías ver "ejecutando..." una vez (o menos), pero en la práctica, se repite hasta que se elimina manualmente. ¿Cómo cambio el valor de x dentro del proceso bifurcado a falso desde fuera del proceso bifurcado después de que se haya llamado a la función "inicio"?
export x=true
start() {
while [ $x == true ]; do
echo running...
sleep 1
done
}
start &
x=false
Respuesta1
La solución simple aquí es utilizar algún tipo de comunicación entre procesos para indicarle al proceso objetivo que realice el cambio. Por ejemplo, podrías utilizar señales:
#!/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
produce esta salida:
$ ./testit.sh
running...
running...
running...
running...
running...
$
Respuesta2
Si está utilizando ksh93
, puede utilizar funciones de disciplina para implementar variables compartidas (consultehttps://stackoverflow.com/questions/13726293/environment-variables-to-be-used-across-multiple-korn-ksh93-shell-scripts-get)
Alternativamente, puedes usar fish
which implementa esta característica a través de un demonio:pescado.