Control de trabajo: cómo guardar el resultado del trabajo en segundo plano en una variable

Control de trabajo: cómo guardar el resultado del trabajo en segundo plano en una variable

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 $nfilesno 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 $nfilesno 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 rsynccanalizaciones con comandos más simples que sleeprepiten 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

información relacionada