Execute uma função do bashrc, mas modifique a variável exportada

Execute uma função do bashrc, mas modifique a variável exportada

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 netcatou 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.

informação relacionada