
Estou tentando executar uma função do meu bashrc que é atualizada a cada minuto e externaliza uma variável. Se parece com isso:
export CFN = ''
_some_fn
{
export CFN = 'test'
sleep 60
_some_fn &
}
_some_fn &
Onde 'teste' é variável, mas quando eu forneço isso, não tenho acesso ao CFN de dentro da função, o que suspeito ser devido ao fato de ela estar sendo executada em subshell. Existe alguma forma de alterar o valor do CFN que foi exportado?
Responder1
Isso não é possível com sua função atual, assim que você coloca em segundo plano, &
ela pega uma cópia da pilha de processos e sai. Não há como as alterações em sua pilha se propagarem para a cópia do trabalho, a menos que você construa explicitamente essa funcionalidade, e é igualmente impossível obter alterações na pilha da função em sua pilha atual.
Você poderia configurar alguma comunicação entre processos para alterar a variável, mas isso é sempre muito complicado de acertar e não tenho certeza de qual é o seu caso de uso. Exemplo de IPC em ambos os 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
Existem muitas alternativas ao mkfifo, geralmente todas mencionadas sob a etiqueta deComunicação entre processos. Se você acha virtude em manter as coisas simples, não se preocupe com isso e apenas grave seus dados em um arquivo em uma extremidade e leia-os na outra. D-Bus é o grande barramento IPC na maioria dos sistemas unix, junto com TCP/ ou UDP/IP (com netcat
ou nc
), mas não vi muitos scripts de shell que os usem.
Sua alternativa final é deixar tudo isso como está e fazer com que seu script funcione sem executá-lo como um trabalho em segundo plano, para que você possa ajustar o ambiente enquanto ele é executado.