Job Control: So speichern Sie die Ausgabe eines Hintergrundjobs in einer Variablen

Job Control: So speichern Sie die Ausgabe eines Hintergrundjobs in einer Variablen

Verwenden von Bash in OSX.

Mein Skript hat diese 2 Zeilen:

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}')

Wenn ich nach der ersten Zeile verwende &(um die beiden rsync-Befehle parallel auszuführen), gibt mein späterer Aufruf $nfilesnichts zurück.

Code:

osascript -e 'display notification "'$nfiles' files transferred to MASTER," & return & "'$nfiles2' transferred to BACKUP," & return & "Log Files Created" with title "Copy Complete"'

Ich kann nicht herausfinden, was los ist. Ich muss die beiden Rsyncs gleichzeitig ausführen.

Antwort1

Der Grund, warum Ihr Beispiel nicht funktioniert, liegt darin, dass der Hintergrundbefehl in einer Subshell-Umgebung ausgeführt wird und daher der Wert $nfilesnicht verfügbar ist (d. h. in Ihrem Beispielcode geht er verloren).

Eine einfache Möglichkeit, dieses Problem zu umgehen, wäre die Verwendung einer temporären Datei. Im verallgemeinerten Beispielcode unten habe ich Ihre rsyncPipelines durch einfachere Befehle ersetzt, die sleepeine beliebige Zahl ausgeben:

# 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

verwandte Informationen