Controle de trabalho: como salvar a saída do trabalho em segundo plano em uma variável

Controle de trabalho: como salvar a saída do trabalho em segundo plano em uma variável

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 $nfilesnã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 $nfilesnã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 rsyncpipelines por comandos mais simples que sleepecoam 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

informação relacionada