Executa uma função do bashrc, mas modifica a variável exportada

1

Estou tentando executar uma função do meu bashrc que atualiza a cada minuto e externaliza uma variável. Parece assim:

export CFN = ''
_some_fn
{
    export CFN = 'test'
    sleep 60
    _some_fn &
}
_some_fn &

Onde 'test' é variável, mas quando eu obtenho isso, eu não tenho acesso ao CFN de dentro da função, o que eu suspeito que seja devido ao fato de que ele está rodando em subshell. Existe uma maneira de alterar o valor do CFN que foi exportado?

    
por BTC 16.04.2015 / 00:12

1 resposta

2

Isso não é possível com a sua função atual, assim que você faz o background com & , é necessária uma cópia da pilha e das folhas do processo. Não há como as alterações em sua pilha se propagarem para a cópia da tarefa, a menos que você crie 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 complicado para acertar, e não sei qual é o seu caso de uso. Exemplo de IPC nos dois 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 para o mkfifo, geralmente todas sob o rótulo de comunicação entre processos . Se você encontrar a virtude em manter as coisas simples, não se preocupe com isso e apenas escreva seus dados em um arquivo em uma extremidade e leia-os na outra. O D-Bus é o grande barramento IPC na maioria dos sistemas unix, junto com TCP / ou UDP / IP (com netcat ou nc ), mas eu não vi muitos scripts de shell que os usam.

Sua alternativa final é deixar tudo isso como está e fazer com que seu script funcione sem executá-lo como uma tarefa em segundo plano, para que você possa ajustar o ambiente enquanto ele é executado.

    
por 16.04.2015 / 01:25