O motivo pelo qual seu exemplo não funcionará é porque o comando background é executado em um ambiente subshell, portanto, o valor de $nfiles
não estará disponível (ex .: em seu código de amostra, ele é perdido).
Uma maneira fácil de contornar esse problema seria usar um arquivo temporário. No código de amostra generalizado abaixo, substituímos você rsync
pipelines por comandos mais simples, que sleep
e ecoam um número arbitrário:
# use existing value of TMPDIR if exists, else set it to /tmp
: ${TMPDIR:=/tmp}
# ensure temporary file will be deleted on interrupt or error:
trap "rm -f $TMPDIR/nfiles.$$; exit 1" 1 2 3 15
# run the first command in background and save output to a temporary file:
(sleep 3; echo 1) > $TMPDIR/nfiles.$$ &
nfiles2=$(sleep 1; echo 2)
# wait for background command to complete:
wait
# save temporary file data in variables:
nfiles=$(cat $TMPDIR/nfiles.$$)
# remove the temp files on normal exit:
rm -f $TMPDIR/nfiles.$$
# $nfiles and $nfiles 2 should now contain the desired data
echo nfiles=$nfiles
echo nfiles2=$nfiles2