Usando Bash no OSX.
Meu script tem estas 2 linhas:
nfiles=$(rsync -auvh --stats --delete --progress --log-file="$SourceRoot/""CopyLog1.txt" "$SourceTx" "$Dest1Tx" | tee /dev/stderr | awk '/files transferred/{print $NF}') &
nfiles2=$(rsync -auvh --stats --delete --progress --log-file="$SourceRoot/""CopyLog2.txt" "$SourceTx" "$Dest2Tx" | tee /dev/stderr | awk '/files transferred/{print $NF}')
Quando uso &
após a primeira linha (para executar os dois comandos rsync em paralelo), minha chamada posterior $nfiles
não retorna nada.
Código:
osascript -e 'display notification "'$nfiles' files transferred to MASTER," & return & "'$nfiles2' transferred to BACKUP," & return & "Log Files Created" with title "Copy Complete"'
Não consigo entender o que está acontecendo. Preciso que os 2 rsyncs sejam executados simultaneamente.
Responder1
A razão pela 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 (ou seja: em seu código de exemplo, ele está perdido).
Uma maneira fácil de contornar esse problema seria usar um arquivo temporário. No código de exemplo generalizado abaixo, substituí seus rsync
pipelines por comandos mais simples que sleep
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