
Estou usando o código abaixo
record_count=0
task()
{
while read -r record ; do
record_count=$(( record_count + 1 ))
.....
done < $1
}
for i in {1..5}; do
task $i &
done
como posso usar o record_count do subshell\processo filho para o shell\processo pai. Eu tentei com return record_count
mas não funciona. existe alguma outra maneira de retornar os valores (se possível, mais de um valor para retornar)
Responder1
"return" é para o código de saída, normalmente "0" indicando sucesso e qualquer outra coisa uma falha. E deve ser um número inteiro menor que 256, portanto geralmente não é útil para retornar o tipo de resultados esperados aqui.
Mas seus subprocessos podem produzir seus resultados como texto, e o processo principal pode, opcionalmente, capturar esses resultados:
record_count=0
task()
{
while read -r record
do
record_count=$(( record_count + 1 ))
done <$1
echo $record_count
}
(
for i in {1..5}
do
task $i &
done
wait
) \
| sort
A “espera” garante que todos os subprocessos foram concluídos antes de prosseguir.
Observe que com processos paralelos, não há garantia da ordem em que eles terminarão, portanto os resultados não aparecerão necessariamente na ordem 1, 2, 3, 4, 5.
Se essa ordem aleatória for um problema, o programa poderá passar uma "chave" para a tarefa e essa chave poderá ser usada para classificar a saída. Neste caso, $i em si poderia ser a chave, mas em geral os nomes dos arquivos não serão números inteiros simples.
Responder2
Você pode usar return record_count
e obter o resultado correto somente se o número estiver entre 0 e 255. E você deve usar o código de retorno desta forma:
for i in {1..5}; do
task $i ; echo $?
done