Usando Bash en OSX.
Mi script tiene estas 2 líneas:
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}')
Cuando uso &
después de la primera línea (para ejecutar los dos comandos rsync en paralelo), mi llamada posterior $nfiles
no devuelve 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"'
No puedo entender qué está pasando. Necesito que los 2 rsyncs se ejecuten simultáneamente.
Respuesta1
La razón por la que su ejemplo no funcionará es porque el comando en segundo plano se ejecuta en un entorno de subshell, por lo tanto, el valor de $nfiles
no estará disponible (es decir, en su código de muestra, se pierde).
Una forma sencilla de solucionar este problema sería utilizar un archivo temporal. En el código de muestra generalizado a continuación, reemplacé sus rsync
canalizaciones con comandos más simples que sleep
repiten un número arbitrario:
# 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