Quando foo
executado em segundo plano, o BASHPID
of foo
( bashpid_of_foo
) não está disponível dentro dos corpos bar_1
para bar_n
via $BASHPID
, pois eles são invocados por meio do recurso de substituição de comando de bash
:
function foo() {
local bashpid_of_foo=$BASHPID
local output
# desired to be shared by all Command Substitutions
# in the body of this function.
local log=/path/to/log.$BASHPID
... >> $log
output=$(bar_1 ...)
...
output=$(bar_n ...)
}
function bar_1() {
# log only specific (and NOT all) messages
# to the shared log file of the invoking thread.
... >> /path/to/log.$BASHPID
}
foo &
foo &
Pergunta: Existe uma maneira elegante de contornar a limitação acima, sem ter que passar bashpid_of_foo
por variáveis de ambiente adhoc ou arquivos de disco externo?
Por elegante , quero dizer, ser capaz de manter as interfaces e os corpos das bar_*
funções limpos confiando apenas nos recursos fornecidos pelo bash. (Por exemplo BASHPID
, é um bash
recurso.)
Se eu tentar substituir o valor de BASHPID
, assim,
out_1=$(BASHPID=$BASHPID bar_1 ...)
... ele (corretamente) reclama de BASHPID
ser uma variável readonly.
EDIT: (1) Adicionada a definição bar_1
acima. (2) Adicionado a 2ª chamada foo
em segundo plano. Cada foo
chamada precisa manter seu próprio arquivo de log, pois gravar em um arquivo comum pode resultar em conteúdo ilegível.
NOTA: Qualquer que seja o log que aconteça no contexto de tempo de execução do foo
, quero que ele vá para o foo
arquivo de log específico, /path/to/log.$BASHPID
SEM passar o nome desse arquivo de log ou mesmo o PID do foo
. foo
pode ter várias instâncias em execução em segundo plano.