
Estoy intentando ejecutar una función desde mi bashrc que se actualiza cada minuto y externaliza una variable. Se parece a esto:
export CFN = ''
_some_fn
{
export CFN = 'test'
sleep 60
_some_fn &
}
_some_fn &
Donde 'prueba' es variable, pero cuando obtengo esto, no tengo acceso al CFN desde el interior de la función, lo que sospecho se debe al hecho de que se está ejecutando en el subshell. ¿Hay alguna manera de cambiar el valor de CFN que se exportó?
Respuesta1
Esto no es posible con su función actual, tan pronto como la pone en segundo plano, &
toma una copia de la pila de procesos y se va. No hay forma de que los cambios en su pila se propaguen a la copia del trabajo a menos que cree explícitamente esa funcionalidad, y es igualmente imposible obtener cambios en la pila de la función en su pila actual.
Podría configurar alguna comunicación entre procesos para cambiar la variable, pero siempre es bastante complicado hacerlo bien y no estoy seguro de cuál es su caso de uso. Ejemplo de IPC en ambos sentidos:
mkfifo -m 600 /var/tmp/cfn-to-fn
mkfifo -m 600 /var/tmp/cfn-from-fn
export CFN = ''
_some_fn
{
read CFN < /var/tmp/cfn-to-fn
# do something with the new CFN here
echo 'processed data' >/var/tmp/cfn-from-fn
_some_fn &
}
_some_fn &
echo 'processme' > /var/tmp/cfn-to-fn
cat /var/tmp/cfn-from-fn
Hay muchas alternativas a mkfifo, generalmente todas mencionadas bajo la etiqueta deComunicación entre procesos. Si encuentra la virtud de mantener las cosas simples, no se moleste con esto y simplemente escriba sus datos en un archivo en un extremo y léalos en el otro. D-Bus es el gran bus IPC en la mayoría de los sistemas Unix, junto con TCP/ o UDP/IP (con netcat
o nc
), pero no he visto muchos scripts de shell que los utilicen.
Su última alternativa es dejar todo esto como está y hacer que su script funcione sin ejecutarlo como trabajo en segundo plano para que pueda modificar el entorno mientras se ejecuta.